权限
PostgreSQL 中所有对象都有一个所有者(owner),通常为创建该对象的用户。对于大多数对象,只允许超级用户(superuser)或者所有者(owner)可以对对象执行操作,其它用户需要授予一定的权限(privileges)。
可以改变一个对象的所有者,比如:
ALTER TABLE table_name OWNER TO new_owner;
只有超级用户或者当当前用户既是对象的 owner,又拥有 SET ROLE 到 new_owner 的权限的时候,才运行进行修改 OWNER 的操作。
可用权限
可使用的权限有很多,比如:SELECT
,INSERT
,UPDATE
,DELETE
,CREATE
, EXECUTE
,USAGE
等,具体可参考 PG 官方文档。
权限的授予与回收
可以通过 GRANT 进行权限的授予,比如:
-- 授予joe用户对accounts表的UPDATE权限
GRANT UPDATE ON accounts TO joe;
具体可参考 PG 官方文档
可以使用 REVOKE 进行权限的回收,比如:
-- 回收 PUBLIC 用户对 accounts 表的所有权限
REVOKE ALL ON accounts FROM PUBLIC;
具体可参考 PG 官方文档
ALL 指代一个对象的所有权限。针对不同的对象,它的具体权限内容有所不同。
PUBLIC 是一个特殊的用户,它指代系统中的所有用户,包括尚未创建的用户。
只有对象的所有者或者超级用户可以授予或者回收权限。
默认情况下,数据库的CONNECT
和TEMPORARY
(创建临时表)权限;函数和存储过程的EXECUTE
权限;语言和数据类型(包括域)的USAGE
权限,被开放给 PUBLIC
,其它对象,比如表、表中的某一列、序列、外部数据包装器等默认不会开放给 PUBLIC
。
当然,可以使用 ALTER DEFAULT PRIVILEGES
来改变默认的这种行为。
ACL(Access Control List)
ACL 即访问控制列表,用于描述一个对象的权限授予情况。每个数据库对象(如表、视图、函数等)都关联着一个ACL,该列表详细记录了哪些用户或角色有权访问该对象,以及他们被授予的具体权限。
ACL 中的每一项都有这样的格式:
grantee=privilege-abbreviation[*].../grantor
grantee
表示权限接收者,如果 grantee
为空,则表示权限接受者为 PUBLIC
。
privilege-abbreviation
是权限的缩写,上面提到的每一种权限类型,都对应有一个单字符的缩写:
SELECT
:r
INSERT
:a
UPDATE
:w
DELETE
:d
TRUNCATE
:D
REFERENCES
:x
TRIGGER
:t
CREATE
:C
CONNECT
:c
TEMPORARY
:T
EXECUTE
:X
USAGE
:U
SET
:s
ALTER SYSTEM
:A
MAINTAIN
:m
如果 ACL 项中的privilege-abbreviation
后跟着一个*
号,表示这个权限在 GRANT 时使用了WITH GRANT OPTION
,也就是说权限的接收者可以继续将该权限授予其它人。
grantor
表示权限的授予者。
可以在使用 psql 中使用 \dp 对象
查看某个对象的 ACL。
ACL 举例
比如我们创建了两个用户,并给 miriam
用户授予了对 PUBLIC
命名空间的创建和使用权限,以使 miriam
能够在 PUBLIC
命名空间下创建对象。
CREATE