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

【干货分享】磐维数据库_一文看懂权限全解析

原创 磐维数据库 2025-06-27
238

权限类型

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

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。

权限的参数说明

权限的缩写及适用对象见下表:

测试序列权限

  • u1 用户创建序列

postgres=# \c postgres u1

Password for user u1:

Non-SSL connection (SSL connection is recommended when requiring high-security)

You are now connected to database "postgres" as user "u1".

postgres=> CREATE SEQUENCE seq1 cache 100;

CREATE SEQUENCE

postgres=> \ds+ seq1

List of relations

Schema | Name | Type | Owner | Size | Storage | Description

--------+------+----------+-------+------------+---------+-------------

u1 | seq1 | sequence | u1 | 8192 bytes | |

(1 row)

postgres=> \dp+ seq1

Access privileges

Schema | Name | Type | Access privileges | Column access privileges

--------+------+----------+-------------------+--------------------------

u1 | seq1 | sequence | u1=rwU/u1 |

(1 row)


  • 使用u2用户查询

postgres=# \c postgres u2

Password for user u2:

Non-SSL connection (SSL connection is recommended when requiring high-security)

You are now connected to database "postgres" as user "u2".

postgres=> select currval('u1.seq1');

ERROR: permission denied for schema u1


测试select权限

  • 赋予u2用户对schema的usage权限以及对序列的select权限

postgres=> grant usage on schema u1 to u2;

GRANT

postgres=> grant select on SEQUENCE seq1 TO u2;

GRANT


  • u2用户再次查询,可以发现 只赋权select时,可以执行currval函数。只是会报错,因为没有执行过nextval函数,但是并没有权限执行nextval函数

postgres=> select currval('u1.seq1');

ERROR: currval of sequence "seq1" is not yet defined in this session

CONTEXT: referenced column: currval

postgres=> select nextval('u1.seq1');

ERROR: permission denied for sequence seq1

CONTEXT: referenced column: nextval


测试usage权限

  • 赋予usage权限

postgres=> revoke select on SEQUENCE seq1 FROM u2;

REVOKE

postgres=> grant usage on SEQUENCE seq1 TO u2;

GRANT


  • nextval和currval可以使用,setval不可以使用

postgres=> select nextval('u1.seq1');

nextval

---------

101

(1 row)

postgres=> select currval('u1.seq1');

currval

---------

101

(1 row)

postgres=> select setval('u1.seq1',110);

ERROR: permission denied for sequence seq1

CONTEXT: referenced column: setval


测试update权限

  • 赋予update权限

postgres=> revoke usage on SEQUENCE seq1 FROM u2;

REVOKE

postgres=> grant update on SEQUENCE seq1 TO u2;

GRANT


  • nextval和setval可以使用,currval不可以使用

postgres=> select currval('u1.seq1');

ERROR: permission denied for sequence seq1

CONTEXT: referenced column: currval

postgres=> select nextval('u1.seq1');

nextval

---------

103

(1 row)

postgres=> select setval('u1.seq1',110);

setval

--------

110

(1 row)

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

评论