权限

    为使其他用户能够使用对象,必须向用户或包含该用户的角色授予必要的权限。

    要撤消已经授予的权限,可以使用REVOKE。对象所有者的权限(例如ALTER、 DROP、COMMENT、INDEX、VACUUM、GRANT和REVOKE)是隐式拥有的,即只要拥有对象就可以执行对象所有者的这些隐式权限。对象所有者可以撤消自己的普通权限,例如,使表对自己以及其他人只读,系统管理员用户除外。

    openGauss支持以下的权限,不同的权限与不同的对象类型关联:

    • SELECT:允许对指定的表、视图、序列执行SELECT命令,UPDATE或DELETE时也需要对应字段上的SELECT权限。

    • INSERT:允许对指定的表执行INSERT命令。

    • UPDATE:允许对声明的表中任意字段执行UPDATE命令。通常,UPDATE命令也需要SELECT权限来查询出哪些行需要更新。SELECT… FOR UPDATE、SELECT… FOR NO KEY UPDATE、SELECT… FOR SHARE和SELECT… FOR KEY SHARE除了需要SELECT权限外,还需要UPDATE权限。

    • DELETE:允许执行DELETE命令删除指定表中的数据。通常,DELETE命令也需要SELECT权限来查询出哪些行需要删除。

    • TRUNCATE:允许执行TRUNCATE语句删除指定表中的所有记录。

    • REFERENCES:创建一个外键约束,必须拥有参考表和被参考表的REFERENCES权限。

    • CREATE:

      • 对于数据库,允许在数据库里创建新的模式。
      • 对于模式,允许在模式中创建新的对象。如果要重命名一个对象,用户除了必须是该对象的所有者外,还必须拥有该对象所在模式的CREATE权限。
      • 对于表空间,允许在表空间中创建表,允许在创建数据库和模式的时候把该表空间指定为缺省表空间。
    • CONNECT:允许用户连接到指定的数据库。

    • EXECUTE:允许使用指定的函数,以及利用这些函数实现的操作符。

    • USAGE:

      • 对于过程语言,允许用户在创建函数的时候指定过程语言。
      • 对于模式,USAGE允许访问包含在指定模式中的对象,若没有该权限,则只能看到这些对象的名称。
      • 对于序列,USAGE允许使用nextval函数。
      • 对于Data Source对象,USAGE是指访问权限,也是可赋予的所有权限,即USAGE与ALL PRIVILEGES等价。
    • ALTER:允许用户修改指定对象的属性,但不包括修改对象的所有者和修改对象所在的模式。

    • DROP:允许用户删除指定的对象。

    • COMMENT:允许用户定义或修改指定对象的注释。

    • INDEX:允许用户在指定表上创建索引,并管理指定表上的索引,还允许用户对指定表执行REINDEX和CLUSTER操作。

    • VACUUM:允许用户对指定的表执行ANALYZE和VACUUM操作。

    • ALL PRIVILEGES:一次性给指定用户/角色赋予所有可赋予的权限。只有系统管理员有权执行GRANT ALL PRIVILEGES。

    • GRANT

      对角色和用户进行授权操作。使用GRANT命令进行用户授权包括三种场景:

      • 将系统权限(例如sysadmin、CREATEDB、CREATEROLE等)授权给角色或用户

        将sysadmin权限赋予指定的角色的语法如下。

      • 将角色的权限赋予其他用户或角色的语法如下。

        1. TO role_name [, ...]
        2. [ WITH ADMIN OPTION ];
      • 将数据库对象授权给角色或用户

        • 将表或视图的访问权限赋予指定的用户或角色。

          1. GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM } [, ...]
          2. | ALL [ PRIVILEGES ] }
          3. ON { [ TABLE ] table_name [, ...]
          4. | ALL TABLES IN SCHEMA schema_name [, ...] }
          5. TO { [ GROUP ] role_name | PUBLIC } [, ...]
          6. [ WITH GRANT OPTION ];
        • 将表中字段的访问权限赋予指定的用户或角色。

          1. GRANT { {{ SELECT | INSERT | UPDATE | REFERENCES | COMMENT } ( column_name [, ...] )} [, ...]
          2. | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
          3. ON [ TABLE ] table_name [, ...]
          4. TO { [ GROUP ] role_name | PUBLIC } [, ...]
          5. [ WITH GRANT OPTION ];
        • 将数据库的访问权限赋予指定的用户或角色。

          1. GRANT { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...]
          2. | ALL [ PRIVILEGES ] }
          3. ON DATABASE database_name [, ...]
          4. [ WITH GRANT OPTION ];
        • 将模式的访问权限赋予指定的用户或角色。

          1. GRANT { { CREATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
          2. ON SCHEMA schema_name [, ...]
          3. TO { [ GROUP ] role_name | PUBLIC } [, ...]
          4. [ WITH GRANT OPTION ];
        • 将表空间的访问权限赋予指定的用户或角色。

          1. GRANT { { CREATE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
          2. ON TABLESPACE tablespace_name [, ...]
          3. TO { [ GROUP ] role_name | PUBLIC } [, ...]
          4. [ WITH GRANT OPTION ];
    • REVOKE

      • 撤销角色或用户的系统权限(例如sysadmin、CREATEDB、CREATEROLE等)

        回收角色上的sysadmin权限。

        1. REVOKE ALL { PRIVILEGES | PRIVILEGE } FROM role_name;
      • 通过角色回收角色上的权限。

      • 回收数据库对象上的权限

        • 回收指定表或视图上权限。

          1. REVOKE [ GRANT OPTION FOR ]
          2. { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM }[, ...]
          3. | ALL [ PRIVILEGES ] }
          4. | ALL TABLES IN SCHEMA schema_name [, ...] }
          5. FROM { [ GROUP ] role_name | PUBLIC } [, ...]
          6. [ CASCADE | RESTRICT ];
        • 回收表上指定字段权限。

          1. REVOKE [ GRANT OPTION FOR ]
          2. { {{ SELECT | INSERT | UPDATE | REFERENCES | COMMENT } ( column_name [, ...] )}[, ...]
          3. | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
          4. ON [ TABLE ] table_name [, ...]
          5. FROM { [ GROUP ] role_name | PUBLIC } [, ...]
          6. [ CASCADE | RESTRICT ];
        • 回收指定数据库上权限。

          1. REVOKE [ GRANT OPTION FOR ]
          2. { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...]
          3. | ALL [ PRIVILEGES ] }
          4. ON DATABASE database_name [, ...]
          5. FROM { [ GROUP ] role_name | PUBLIC } [, ...]
          6. [ CASCADE | RESTRICT ];
        • 回收指定模式上权限。

          1. REVOKE [ GRANT OPTION FOR ]
          2. { { CREATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
          3. ON SCHEMA schema_name [, ...]
          4. FROM { [ GROUP ] role_name | PUBLIC } [, ...]
          5. [ CASCADE | RESTRICT ];
        • 回收指定表空间上权限。

          1. REVOKE [ GRANT OPTION FOR ]
          2. { { CREATE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
          3. ON TABLESPACE tablespace_name [, ...]
          4. FROM { [ GROUP ] role_name | PUBLIC } [, ...]
          5. [ CASCADE | RESTRICT ];
    • table_name

      已存在表名称。

    • column_name

    • schema_name

      已存在模式名称。

    • database_name

      已存在数据库名称。

    • tablespace_name

      表空间名称。

    • WITH GRANT OPTION

      如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC。

    • 将系统权限授权给用户或者角色。

      创建名为joe的用户,并将sysadmin权限授权给他。

      1. openGauss=# CREATE USER joe PASSWORD 'xxxxxxxx';
      2. CREATE ROLE
      3. openGauss=# GRANT ALL PRIVILEGES TO joe;
      4. ALTER ROLE

      授权成功后,用户joe会拥有sysadmin的所有权限。

    • 将对象权限授权给用户或者角色。

      1. 创建模式test以及表customer。

        1. openGauss=# CREATE SCHEMA test;
        2. openGauss=# CREATE TABLE customer
        3. (
        4. c_customer_sk integer,
        5. c_customer_id char(5),
        6. c_first_name char(6),
        7. c_last_name char(8),
        8. Amount integer
        9. );
        10. CREATE TABLE
      2. 撤销joe用户的sysadmin权限,然后将模式test的使用权限和表customer的所有权限授权给用户joe。

        授权成功后,joe用户就拥有了customer表的所有权限,包括增删改查等权限。

      3. 将表customer中c_customer_sk、c_customer_id、c_first_name列的查询权限,c_last_name的更新权限授权给joe。

        1. openGauss=# GRANT select (c_customer_sk,c_customer_id,c_first_name),update (c_last_name) ON customer TO joe;
        2. GRANT

        授权成功后,用户joe对表customer中c_customer_sk,c_customer_id,c_first_name的查询权限会立即生效。如果joe用户需要拥有将这些权限授权给其他用户的权限,可以通过以下语法对joe用户进行授权。

        1. openGauss=# GRANT select (c_customer_sk,c_customer_id,c_first_name) ON customer TO joe WITH GRANT OPTION;
        2. GRANT

        将数据库postgres的连接权限授权给用户joe,并给予其在postgres中创建schema的权限,而且允许joe将此权限授权给其他用户。

        1. openGauss=# GRANT create,connect on database postgres TO joe WITH GRANT OPTION;
        2. GRANT

        创建角色test_manager,将模式test的访问权限授权给角色test_manager,并授予该角色在test下创建对象的权限,不允许该角色中的用户将权限授权给其他人。

        1. openGauss=# CREATE ROLE test_manager PASSWORD 'xxxxxxxx';
        2. CREATE ROLE
        3. openGauss=# GRANT USAGE,CREATE ON SCHEMA test TO test_manager;
        4. GRANT

        创建表空间tpcds_tbspc,并将表空间的所有权限授权给用户joe,但用户joe无法将权限继续授予其他用户。

        1. openGauss=# CREATE TABLESPACE tpcds_tbspc RELATIVE LOCATION 'tablespace/tablespace_1';
        2. CREATE TABLESPACE
        3. openGauss=# GRANT ALL ON TABLESPACE tpcds_tbspc TO joe;
        4. GRANT
    • 将用户或者角色的权限授权给其他用户或角色。

      1. 创建角色manager,将joe的权限授权给manager,并允许该角色将权限授权给其他人。

        1. openGauss=# CREATE ROLE manager PASSWORD 'xxxxxxxx';
        2. CREATE ROLE
        3. openGauss=# GRANT joe TO manager WITH ADMIN OPTION;
        4. GRANT ROLE
      2. 创建用户senior_manager,将用户manager的权限授权给该用户。

        1. openGauss=# CREATE ROLE senior_manager PASSWORD 'xxxxxxxx';
        2. CREATE ROLE
        3. GRANT ROLE