GaussDB 中 alter default privileges 的使用示例
第一章 Alter default privileges的作用
1.1 功能描述
在GaussDB的官方手册中,对于alter default privileges的功能描述如下:ALTER DEFAULT PRIVILEGES语句用于修改数据库中用户在特定对象上默认拥有的权限,不会影响分配到已有对象中的权限。
我们知道,数据库中还有一个GRANT的命令,也是给用户赋权的,而且,也是可以是在特定对象上进行赋权。这两个命令有什么区别呢?
1.2 与GRANT命令作用的差异
我们通过以下示例,展示alter default privileges执行后的效果与grant执行后的效果差异。
假设我们有两个用户:user1和user2, 我们希望user2可以访问到user1创建的所有表。
构建测试环境:
1、 创建用户user1和user2
2、 使用user1创建表user1_tab1
3、 使用user2登录目标库,并查询的结果。
如上图所示,可见,此时无权限访问user1的表。
4、 使用grant命令,授权user2可以访问user1的表
5、 再次使用user2登录目标库并查询
结果,发现我们还是被提示无权限。
这是因为我们还需要有在SCHEMA上的USAGE权限,才能有完全的权限来访问目标表。
6、 为user2授权在schema user1上有USAGE的权限
7、 再次使用user2登录目标库并查询
如上图所示,至此,user2已经可以正常访问user1的user1_tab1表了。
8、 继续在user1中创建第二张表,并验证user2是否可以访问第二张表。
如上两图所示,user2无权限访问新创建的第二张表。可见,在第4步,使用grant进行的授权命令,只对已经存在的表生效。而在授权后,新建的表,是不会自动授权的。
9、 使用alter default privileges命令授权user2可以访问user1的表
10、 使用user1用户,创建第三张表,并验证user2是否可以访问第三张表。
如上图所示,执行alter default privileges后,user1中再新建的表,user2是可以访问的。但在执行alter default privileges之前创建的user_tab2表,user2依然是无法访问的。此时,要通过grant命令,进行再次授权才可以。如下图所示:
通过以上实验,我们可知,grant命令只对已存在的对象生效,而alter default privileges则只对未来创建的对象生效。所以,当我们希望某个用户不仅可以访问另外一个用户或SCHEMA下的对象,还可以访问未来在另一个用户或SCHEMA下新创建的对象,则还要注意执行alter default privileges命令进行授权。
下一章,我们对alter default privileges命令的语法和使用,做进一步说明。
第二章 Alter default privileges的命令用法
2.1 命令语法
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
从上述的文本中,可知目前只支持对表(包括视图)、序列、函数,类型,密态数据库客户端主密钥和列加密密钥的权限进行更改。
而每一个abbreviated_grant_or_revoke又有不同的语法(详情请见附录部分),在下一节中,我们以grant_on_tables_clause和revoke_on_tables_clause为例,通过示例的方式进行说明。其它子句同理。
如下所示,在ALTER DEFAULT PRIVILEGES关键字与abbreviated_grant_or_revoke之间,还有两个选项:[ FOR { ROLE | USER } target_role [, …] ] 和[ IN SCHEMA schema_name [, …] ]
ALTER DEFAULT PRIVILEGES[ FOR { ROLE | USER } target_role [, ...] ][ IN SCHEMA schema_name [, ...] ]
abbreviated_grant_or_revoke;
2.1.1 [ FOR { ROLE | USER } target_role [, …] ]
该选项用于指定要把哪一个,或几个角色或用户中的对象授权给目标用户。如果省略了该选项,则表示将当前会话连接所使用的用户中的对象授权给目标用户。
2.1.2 [ IN SCHEMA schema_name [, …] ]
该选项用于进一步限定,指定角色或用户的对象中,位于哪个,或哪几个SCHEMA中的对象生效。
注:在PG体系的数据库(包括Gaussdb)中,允许一个用户有多个SCHEMA。不同SCHEMA中的对象可以重名。SCHEMA位于DATABASE之下,即SCHEMA只能属于特定的DATABASE,而不能跨数据库。
2.1.3 grant_on_tables_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命令。相较于完整版的GRANT命令,有以下几处不同:
少了TRIGGER权限
GRANT命令中,ON { [ TABLE ] table_name [, …] | ALL TABLES IN SCHEMA schema_name [, …] } 的选项,对于其中的[ TABLE ] table_name [, …]选项,由于alter default privileges是针对未来的对象进行设置,所以,当下是不可知的,因此,该选项对本命令无意义;而ON ALL TABLES选项则改为了ON TABLES, IN SCHEMA schema_name [, …]选项,则转到alter default privileges命令中的[ IN SCHEMA schema_name [, …] ]选项中实现。
2.1.4 revoke_on_tables_clause
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命令。相较于完整版的REVOKE命令,其差异主要是在REVOKE命令中,ON { [ TABLE ] table_name [, …] | ALL TABLES IN SCHEMA schema_name [, …] } 的选项上,其中[ TABLE ] table_name [, …]选项,由于alter default privileges是针对未来的对象进行设置,所以,当下是不可知的,因此,该选项对本命令无意义;而ON ALL TABLES选项,则变为了ON TABLES, IN SCHEMA schema_name [, …]则转到alter default privileges中的[ IN SCHEMA schema_name [, …] ]选项中实现。
对alter default privileges的使用,在下篇文章中,将继续通过使用示例来做进一步的说明。