权限
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:rINSERT:aUPDATE:wDELETE:dTRUNCATE:DREFERENCES:xTRIGGER:tCREATE:CCONNECT:cTEMPORARY:TEXECUTE:XUSAGE:USET:sALTER SYSTEM:AMAINTAIN:m
如果 ACL 项中的privilege-abbreviation后跟着一个*号,表示这个权限在 GRANT 时使用了WITH GRANT OPTION,也就是说权限的接收者可以继续将该权限授予其它人。
grantor表示权限的授予者。
可以在使用 psql 中使用 \dp 对象 查看某个对象的 ACL。
ACL 举例
比如我们创建了两个用户,并给 miriam 用户授予了对 PUBLIC 命名空间的创建和使用权限,以使 miriam 能够在 PUBLIC 命名空间下创建对象。
CREATE

最低0.47元/天 解锁文章
4485

被折叠的 条评论
为什么被折叠?



