权限类型
磐维支持以下的权限,不同的权限与不同的对象类型关联:
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)




