角色与权限
PostgreSQL 中的角色和权限是如何工作的?
在 PostgreSQL 中,用户和组都是角色。GRANT 授予角色对对象的权限,作为另一个角色成员的角色可以使用该角色的权限。
PostgreSQL 通过角色来控制访问。角色可以充当用户(具有 LOGIN 属性)、组,或两者兼具,并且角色拥有数据库对象。SELECT、INSERT、UPDATE 和 USAGE 等权限通过 GRANT 在特定对象上授予,通过 REVOKE 收回。
让一个角色成为另一个角色的成员,它就可以使用后者的权限,因此常见做法是把权限授予组角色,再将登录角色加入这些组。角色在整个数据库集群范围内存在,而不是按数据库划分。对象的所有者和超级用户可以对其进行任何操作,因此应将应用程序角色与所有者和超级用户分开。
示例
该示例创建一个名为 reporting 的组角色,以及属于该组、名为 analyst 的登录角色,并将 SELECT 权限授予该组。has_table_privilege 确认 analyst 可以读取该表,但不能向其中插入数据。
CREATE ROLE reporting NOLOGIN;
CREATE ROLE analyst LOGIN IN ROLE reporting;
CREATE TABLE revenue_daily (day date PRIMARY KEY, amount numeric);
GRANT SELECT ON revenue_daily TO reporting;
SELECT has_table_privilege('analyst', 'revenue_daily', 'SELECT') AS can_select,
has_table_privilege('analyst', 'revenue_daily', 'INSERT') AS can_insert;适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。
参考资料
PostgreSQL 官方文档(英文)。