1. PG权限位说明
使用psql的\dp 命令获取表和字段的现存权限的有关的信息。例如:
=> \dp mytable
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+---------+-------+-----------------------+--------------------------
public | mytable | table | miriam=arwdDxt/miriam | col1:
: =r/miriam : miriam_rw=rw/miriam
: admin=arw/miriam
(1 row)
\dp显示的条目解释如下:
rolename=xxxx -- 赋予一个角色的权限
=xxxx -- 赋予 PUBLIC 的权限
r -- SELECT ("读")
w -- UPDATE ("写")
a -- INSERT ("追加")
d -- DELETE
D -- TRUNCATE
x -- REFERENCES
t -- TRIGGER
X -- EXECUTE
U -- USAGE
C -- CREATE
c -- CONNECT
T -- TEMPORARY
arwdDxt -- ALL PRIVILEGES (用于表,用于其他对象时不同)
* -- 给前面权限的授权选项
/yyyy -- 授出这个权限的角色
2. PG权限详解
SELECT
允许从指定表、视图或序列的任何列或者列出的特定列进行SELECT。还允许使用COPY TO。在UPDATE或DELETE中引用已有列值时也需要这个特权。对于序列,这个特权也允许使用currval函数。对于大对象,这个特权允许读取对象。INSERT
允许INSERT一个新行到指定表中。如果列出了特定的列,只有这些列能在INSERT命令中被赋值(其他列将因此收到默认值)。还允许COPY FROM。UPDATE
允许对指定表、视图或序列的任何列或者列出的特定列进行UPDATE(实际上,任何非平凡的UPDATE命令也会要求SELECT特权,因为它必须引用表列来判断哪些行要被更新或者为列计算新值)。除SELECT特权之外,SELECT … FOR UPDATE以及SELECT … FOR SHARE也要求至少一列上的这个特权。对于序列,这个特权允许使用nextval和setval函数。对于大对象,这个特权允许写入或者截断对象。DELETE
允许从指定的表中DELETE一行(实际上,任何非平凡的DELETE命令也将要求SELECT特权,因为它必须引用表列来判断要删除哪些行)。TRUNCATE
允许在指定的表上TRUNCATE。REFERENCES
允许创建引用指定表或指定表列的外键约束。(请参阅CREATE TABLE语句。)TRIGGER
允许在指定的表上创建触发器(见CREATE TRIGGER语句)。CREATE
对于数据库,允许在其中创建新模式或发布。
对于模式,允许在其中创建新的对象。要重命名一个已有对象,你必须拥有该对象并且具有所在模式的这个特权。
对于表空间,允许在其中创建表、索引和临时文件,并且允许创建使用该表空间作为默认表空间的数据库(注意撤回这个特权将不会更改现有对象的放置位置)。CONNECT
允许用户连接到指定数据库。在连接开始时会检查这个特权(除了检查由pg_hba.conf施加的任何限制之外)。TEMPORARY
TEMP
允许在使用指定数据库时创建临时表。EXECUTE
允许使用指定的函数以及使用在该函数之上实现的任何操作符。这是适用于函数的唯一一种特权类型(这种语法也可用于聚集函数)。USAGE
对于过程语言,允许使用指定的语言创建函数。这是适用于过程语言的唯一一种特权类型。
对于模式,允许访问包含在指定模式中的对象(假定这些对象的拥有特权要求也满足)。本质上这允许被授权者在模式中“查阅”对象。如果没有这个权限,还是有可能看到对象名称,例如通过查询系统表。还有,在撤回这个权限之后,现有后端可能有语句之前已经执行过这种查阅,因此这不是一种阻止对象访问的完全安全的方法。
对于序列,这种特权允许使用currval和nextval函数。
对于类型和域,这种特权允许用该类型或域来创建表、函数和其他模式对象(注意这不能控制类型的一般“用法”,例如出现在查询中的该类型的值。它只阻止基于该类型创建对象。该特权的主要目的是控制哪些用户在一个类型上创建了依赖,这能够阻止拥有者以后更改该类型)。
对于外部数据包装器,这个特权允许使用该外部数据包装器创建新服务器。
对于服务器,这个特权允许使用该服务器创建外部表, 被授权者还可以创建、修改或删除与该服务器相关的他们自己的用户映射。ALL PRIVILEGES
一次授予所有的可用特权。在PostgreSQL中,PRIVILEGES关键词是可选的,但是在严格的 SQL 中是要求它的。
其他命令所要求的特权会被列在相应命令的参考页中。
3. 需要注意的其他问题
3.1 关于库和表的删除权限
删除库需要是这个库的owner,删除表需要是表的创建者。
3.2 已赋权给库下所有表的权限给账号B,但在A账号新建表后,B账号无此表权限。
语句只是对当时状态下的所有表进行赋权,如果后续不是用的B账号新建的表,还是会出现权限不足问题(需要重新赋权一次)。