
# 管理权限
设置或更改数据库用户或角色权限，可以使用DCL（Data Control Language，数据控制语言）语句。
#### 背景信息
数据库对象创建后，创建该对象的用户即成为其所有者。数据库安装后，默认未开启三权分立，数据库系统管理员具有与对象所有者相同的权限。也就是说对象创建后，默认只有对象所有者或者系统管理员可以查询、修改和删除对象，以及通过GRANT将对象的权限授予其他用户。
为使其他用户能够使用对象，也可以向用户或包含该用户的角色授予必要的权限。
#### 注意事项
不建议用户修改系统表和系统视图的权限。
#### 管理对象权限
1. 以管理员用户root登录数据库。
2. 创建用户user1和用户user2。 
   ```
   gaussdb=# CREATE USER user1 password '********';
   gaussdb=# CREATE USER user2 password '********';
   ```
   
   
3. 以用户user2登录数据库。
4. 创建用户表tbl，将用户user2的USAGE权限授予用户user1，将对表tbl进行SELECT的权限授予用户user1。 
   ```
   gaussdb=> CREATE TABLE user2.tbl(id int, name varchar(5));
   CREATE TABLE
   gaussdb=> GRANT USAGE ON SCHEMA user2 TO user1;
   GRANT
   gaussdb=> GRANT SELECT ON TABLE user2.tbl TO user1;
   GRANT
   ```
   
   
5. 以用户user1登录数据库。
6. 用户user1查询用户表tbl成功，插入用户表tbl权限不足失败。 
   ```
   gaussdb=> SELECT * FROM user2.tbl;
    id | name
   ----+------
   (0 rows)
    
   gaussdb=> INSERT INTO user2.tbl VALUES (1,'TOM');
   ERROR:  The operation permission on relation tbl is denied.
   ```
   
   
7. 以用户user2登录数据库。
8. 撤销用户user1对表tbl进行SELECT的权限，将对表tbl进行INSERT的权限授予用户user1。 
   ```
   gaussdb=> REVOKE SELECT ON TABLE user2.tbl FROM user1;
   REVOKE
   gaussdb=> GRANT INSERT ON TABLE user2.tbl TO user1;
   GRANT
   ```
   
   
9. 以用户user1登录数据库。
10. 查询用户表tbl权限不足失败，插入用户表tbl成功。 
    ```
    gaussdb=> SELECT * FROM user2.tbl;
    ERROR:  The operation permission on relation tbl is denied.
    gaussdb=> INSERT INTO user2.tbl VALUES (1,'TOM');
    INSERT 0 1
    ```
    
    
11. 以管理员用户root登录数据库。
12. 清理环境。 
    ```
    gaussdb=# DROP USER user1, user2 CASCADE;
    DROP ROLE
    ```
    
    
 
#### 管理用户和角色
1. 以管理员用户root登录数据库。
2. 创建角色role1和角色role2。 
   ```
   gaussdb=# CREATE ROLE role1 WITH password 'xxxxxxxx';
   CREATE ROLE
   gaussdb=# CREATE ROLE role2 WITH password 'xxxxxxxx';
   CREATE ROLE
   ```
   
   
3. 修改角色role1具有CREATEDB和LOGIN属性，角色role2为默认权限。 
   ```
   gaussdb=# ALTER ROLE role1 WITH CREATEDB;
   ALTER ROLE
   gaussdb=#  ALTER ROLE role1 WITH LOGIN;
   ALTER ROLE
   ```
   
   
4. 查看系统视图pg_roles获取角色的相关信息。 
   ```
   gaussdb=# SELECT oid, rolname, rolcreatedb, rolcanlogin FROM pg_roles WHERE rolname='role1' or rolname='role2';
     oid  | rolname | rolcreatedb | rolcanlogin
   -------+---------+-------------+-------------
    16750 | role1   | t           | t
    16778 | role2   | f           | f
   (2 rows)
   ```
   
   
5. 以用户role1登录数据库。
6. 通过以下命令创建数据库test_db，显示CREATE DATABASE表示创建成功。 
   ```
   gaussdb=# CREATE DATABASE test_db;
   CREATE PLUGGABLE DATABASE
   ```
   
   
7. 将角色role1权限授予角色role2，则角色role2继承role1的相关对象权限。 
   ```
   gaussdb=# GRANT role1 TO role2;
   GRANT ROLE
   ```
   
   
8. 查看系统表pg_auth_members获取角色成员关系。 
   ```
   gaussdb=# SELECT * FROM pg_auth_members;
    roleid | member | grantor | admin_option
   --------+--------+---------+--------------
     16750 |  16778 |   16750 | f
   (1 row)
   ```
   
   
9. 以管理员用户root登录数据库。
10. 关闭并删除数据库test_db，删除角色role1和role2。 
    ```
    gaussdb=#  ALTER DATABASE test_db CLOSE;
    ALTER PLUGGABLE DATABASE
    gaussdb=#  DROP DATABASE test_db;
    DROP PLUGGABLE DATABASE
    gaussdb=# DROP ROLE role1,role2;
    DROP ROLE
    ```
    
    
 
