更新时间:2026-07-28 GMT+08:00
分享

管理权限

设置或更改数据库用户或角色权限,可以使用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

相关文档