在 《GaussDB中 alter default privileges 的使用示例(上)》 中,对alter default privileges的作用及语法做了介绍,本文,将继续通过使用示例来做进一步的说明。

第三章 使用示例

3.1 示例1:使用初始用户授权,不指定SCHEMA

使用数据库初始用户(默认是gaussdb)操作,允许user2用户,访问user1用户中已经存在的表(包含视图),以及未来创建的表(包含视图)。

1、 清理环境,避免影响

图片.png

2、 创建user1,user2,并允许user2访问user1中此后创建的表和视图。

图片.png

3、 在user1中创建表及视图

图片.png

4、 使用user2登录数据库,并访问user1中创建的表及视图

图片.png

如上所示,用户user2已可以访问授权以后,user1创建的表及视图。

3.2 示例2:使用当前用户授权

在示例1中,我们使用的是数据库的初始用户,来指定将user1中未来创建的表(包含视图)允许user2来访问。所以,在命令中,我们需要使用“for user user1”的选项来指定user1。若我们使用user1用户自身来授权user2时,则该选项可以省略。

测试过程如下:

1、 清理环境,避免影响

图片.png

2、 创建user1,user2,并允许user2访问user1中此后创建的表和视图。

图片.png

使用user1登录后,执行alter default privileges 命令:

图片.png

注意,上图与示例1的区别在于:其一,执行的用户是user1,其二,命令中无需指定“for user user1”选项。当不指定该选项时,默认是当前用户。

3、 在user1中创建表及视图

图片.png

4、 使用user2登录数据库,并访问user1中创建的表及视图

图片.png

如上所示,用户user2已可以访问授权以后,user1创建的表及视图。

3.3 示例3:指定SCHEMA

在前面的示例1和示例2,是将user1下的表(包括视图),无论其处于哪个SCHEMA下,都允许user2来访问。如果只允许user2访问user1指定SCHEMA(可以指定多个)下的表(包括视图),则需要使用到“[ IN SCHEMA schema_name [, …] ]”选项。
以下,将展示此场景需求下的操作及效果:

1、 清理环境,避免影响

图片.png

2、 创建user1,user2及所需的schema

为user1额外再创建两个schema(user_schema1和user_schema2),设置其owner为user1,并允授权user2对user1所拥有的三个schema(user1,user_schema1,user_schema2)的usage权限
图片.png

3、 使用alter default privileges命令,允许user2访问

user_schema1和user_schema2中未来创建的表(包括视图)
图片.png

如上图所示,我们这里使用到了“in schema user_schema1,user_schema2”的选项。

4、 使用user1创建相应的表和视图

使用user1,分别在上述的三个schema中,各创建一张表。在三个schema中,还各创建三个视图,这三个视图用于分别访问不同schema中的表。目的是测试user2可以访问哪些schema中的表和视图。
图片.png

如上图所示,在三个schema中,分别创建了三张表。

然后在三个schema中,各创建三个视图,用于分别访问上述三张表。如下图所示:
图片.png

如上图所示,虽然三个视图名称完全相同,但由于它们分别位于不同的schema中,所以,并不会产生类似“对象已存在”的冲突。

5、 使用user2访问上述的三张表

图片.png

如上所示,由于我们在使用alter default privileges给user2授权时,使用了“in schema user_schema1,user_schema2”的选项,所以,user2只能访问位于这两个schema中的表。

6、 使用user2访问前面创建的九个视图。

先来访问位于user1 schema中的三个视图:
图片.png

如上图所示,user2均无法访问。这是因为user2并无访问schema user1中的权限。
接下来,访问 user_schema1中的三个视图:
图片.png

如上图所示,我们发现,尽管我们并没有访问位于user1 schema中表user1_tab1的权限,但并不影响我们对位于user_schema1中访问该表的视图vw_user1_tab1的访问。

最后,我们访问 user_schema2中的三个视图:
图片.png

如上图所示,其结果与前述类似,这里不再赘述。

第四章 附录

ALTER DEFAULT PRIVILEGES语法摘要说明
语法格式:

  ALTER DEFAULT PRIVILEGES
    [ FOR { ROLE | USER } target_role [, ...] ]
    [ IN SCHEMA schema_name [, ...] ]
    abbreviated_grant_or_revoke;

其中abbreviated_grant_or_revoke子句用于指定对哪些对象进行授权或回收权限。有如下一些子句:

• grant_on_tables_clause
• grant_on_sequences_clause
• grant_on_functions_clause
• grant_on_types_clause
• grant_on_client_master_keys_clause
• grant_on_column_encryption_keys_clause
• revoke_on_tables_clause
• revoke_on_sequences_clause
• revoke_on_functions_clause
• revoke_on_types_clause
• revoke_on_client_master_keys_clause
• revoke_on_column_encryption_keys_clause

其中grant_on_tables_clause子句用于对表授权。

 GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM } 
  [, ...] | ALL [ PRIVILEGES ] }
    ON TABLES 
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]

其中grant_on_sequences_clause子句用于对序列授权。

GRANT { { SELECT | UPDATE | USAGE | ALTER | DROP | COMMENT }
[, …] | ALL [ PRIVILEGES ] }
ON SEQUENCES
TO { [ GROUP ] role_name | PUBLIC } [, …]
[ WITH GRANT OPTION ]

其中grant_on_functions_clause子句用于对函数授权。

  GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON FUNCTIONS 
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]

其中grant_on_types_clause子句用于对类型授权。

  GRANT { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON TYPES 
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]

其中grant_on_client_master_keys_clause子句用于对客户端主密钥授权。

  GRANT { { USAGE  | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON CLIENT_MASTER_KEYS
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]

其中grant_on_column_encryption_keys_clause子句用于对列加密密钥授权。

 GRANT { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON COLUMN_ENCRYPTION_KEYS 
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ]

其中revoke_on_tables_clause子句用于回收表对象的权限。

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM } 
    [, ...] | ALL [ PRIVILEGES ] }
    ON TABLES 
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]

其中revoke_on_sequences_clause子句用于回收序列的权限。

REVOKE [ GRANT OPTION FOR ]
{ { SELECT | UPDATE | USAGE | ALTER | DROP | COMMENT }
[, …] | ALL [ PRIVILEGES ] }
ON SEQUENCES
FROM { [ GROUP ] role_name | PUBLIC } [, …]
[ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]

其中revoke_on_functions_clause子句用于回收函数的权限。

REVOKE [ GRANT OPTION FOR ]
    { {EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON FUNCTIONS 
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]

其中revoke_on_types_clause子句用于回收类型的权限。

  REVOKE [ GRANT OPTION FOR ]
    { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON TYPES 
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]

其中revoke_on_client_master_keys_clause子句用于回收客户端主密钥的权限。

  REVOKE [ GRANT OPTION FOR ]
    { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON CLIENT_MASTER_KEYS 
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]

其中revoke_on_column_encryption_keys_clause子句用于回收列加密密钥的权限。

  REVOKE [ GRANT OPTION FOR ]
    { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] }
    ON COLUMN_ENCRYPTION_KEYS
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]

参数说明

target_role
已有角色的名称。如果省略FOR ROLE/USER,则缺省值为当前角色/用户。
取值范围:已有角色的名称。

schema_name
现有模式的名称。
target_role必须有schema_name的CREATE权限。
取值范围:现有模式的名称。

role_name
被授予或者取消权限角色的名称。
取值范围:已存在的角色名称。

如果想删除一个被赋予了默认权限的角色,有必要恢复改变的缺省权限或者使用DROP OWNED BY来为角色脱离缺省的权限记录。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐