当前位置: 首页 > news >正文

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的表
图片.png

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的使用,在下篇文章中,将继续通过使用示例来做进一步的说明。

http://www.lryc.cn/news/625741.html

相关文章:

  • 从H.264到AV1:音视频技术演进与模块化SDK架构全解析
  • Meta首款AR眼镜Hypernova呼之欲出,苹果/微美全息投入显著抢滩市场新增长点!
  • 搭建最新--若依分布式spring cloudv3.6.6 前后端分离项目--步骤与记录常见的坑
  • 磨砂玻璃登录页面使用教程 v0.1.1
  • 可靠性测试:软件稳定性的守护者
  • t12 low power design: power plan脚本分享(4) power stripe
  • 9.Ansible管理大项目
  • MCP(模型上下文协议):是否是 AI 基础设施中缺失的标准?
  • Flink原理与实践:第一章大数据技术概述总结
  • Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
  • 构建自主企业:AgenticOps 的技术蓝图
  • VS Code 终端完全指南
  • Java 大视界 -- Java 大数据机器学习模型在自然语言处理中的多语言翻译与文化适应性优化
  • Transformer十问
  • Java试题-选择题(11)
  • OpenHarmony 之多模态输入子系统源码深度架构解析
  • 记录一次问题,点击详情时设置Editor不可用,点击修改时也不可用了
  • Node.js 在 Windows Server 上的离线部署方案
  • 如何将任意文件一键转为PDF?
  • Markdown to PDF/PNG Converter
  • UniApp 微信小程序之间跳转指南
  • 专题:2025母婴行业消费洞察与分龄营养趋势报告|附40 +份报告PDF、交互图表数据汇总下载
  • 微信小程序实现蓝牙开启自动播放BGM
  • Java技术总监的成长之路(技术干货分享)
  • CAD图纸如何批量转换成PDF格式?
  • 【动态规划:路径问题】最小路径和 地下城游戏
  • 【网络运维】Ansible roles:角色管理
  • ES支持哪些数据类型,和MySQL之间的映射关系是怎么样的?
  • 点大餐饮独立版系统源码v1.0.3+uniapp前端+搭建教程
  • nuxt使用vue-echarts第三方插件报错document is not defined