暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL中序列权限

原创 仙人掌 2023-05-15
2569
序列的权限定义

官方文档中可以看到序列的所有权限为rwU,分别对应SELECT、UPDATE、USAGE;

对于序列,SELECT权限允许使用currval 函数

对于序列,UPDATE权限允许使用 nextval 和 setval 函数

对于序列,USAGE权限允许使用currval 和 nextval 函数

序列权限测试

序列seq_temp的owner为test用户,未给yhru用户赋权时,执行序列函数提示无权限

test_db=> \ds+ seq_temp List of relations Schema | Name | Type | Owner | Size | Description --------+----------+----------+-------+------------+------------- public | seq_temp | sequence | test | 8192 bytes | (1 row) test_db=> \c - yhru You are now connected to database "test_db" as user "yhru". test_db=> select currval('seq_temp'); ERROR: permission denied for sequence seq_temp test_db=> select nextval('seq_temp'); ERROR: permission denied for sequence seq_temp test_db=> select setval('seq_temp',100); ERROR: permission denied for sequence seq_temp test_db=>
复制

只赋权select时,可以执行currval函数,但是会报错,因为没有执行过nextval函数

test_db=> grant select on SEQUENCE seq_temp TO yhru ; GRANT test_db=> \dp+ seq_temp Access privileges Schema | Name | Type | Access privileges | Column privileges | Policies --------+----------+----------+-------------------+-------------------+---------- public | seq_temp | sequence | test=rwU/test +| | | | | yhru=r/test | | (1 row) test_db=> \c - yhru You are now connected to database "test_db" as user "yhru". test_db=> select currval('seq_temp'); ERROR: currval of sequence "seq_temp" is not yet defined in this session test_db=>
复制

赋权select和update时,可以使用所有序列操作函数

test_db=> grant update on SEQUENCE seq_temp TO yhru ; GRANT test_db=> \c - yhru You are now connected to database "test_db" as user "yhru". test_db=> \dp+ seq_temp Access privileges Schema | Name | Type | Access privileges | Column privileges | Policies --------+----------+----------+-------------------+-------------------+---------- public | seq_temp | sequence | test=rwU/test +| | | | | yhru=rw/test | | (1 row) test_db=> select setval('seq_temp',10); setval -------- 10 (1 row) test_db=> select currval('seq_temp'); currval --------- 10 (1 row) test_db=> select nextval('seq_temp'); nextval --------- 11 (1 row) test_db=>
复制

只赋权usage时,nextval和currval可以使用,setval不可以使用

test_db=> grant usage on SEQUENCE seq_temp TO yhru ; GRANT test_db=> \c - yhru You are now connected to database "test_db" as user "yhru". test_db=> \dp+ seq_temp Access privileges Schema | Name | Type | Access privileges | Column privileges | Policies --------+----------+----------+-------------------+-------------------+---------- public | seq_temp | sequence | test=rwU/test +| | | | | yhru=U/test | | (1 row) test_db=> select nextval('seq_temp'); nextval --------- 12 (1 row) test_db=> select currval('seq_temp'); currval --------- 12 (1 row) test_db=> select setval('seq_temp',10); ERROR: permission denied for sequence seq_temp test_db=>
复制
结论

如果需要有修改序列的权限可以直接赋权ALL

如果只是使用序列不需要修改可以赋权USAGE

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论