内容提要
PostgreSQL有一个管理用户角色和权限的系统。用户、组和角色本质上是相同的,但用户默认可以登录。角色具有定义其在数据库系统中的操作的属性。权限可以在数据库、模式和表级别上分配。ALTER DEFAULT PRIVILEGE命令允许管理员为特定角色创建的对象定义默认访问级别。PostgreSQL中的预定义角色简化了授予常用信息访问权限的过程。在PostgreSQL中,推荐使用细粒度权限控制的方法。
延伸解读
PostgreSQL 15 公共模式权限变更
从 PostgreSQL 15 开始,公共模式(public schema)的默认权限发生了重要变化:普通用户不再能在公共模式中创建对象。此前,所有用户对公共模式拥有创建和使用权限,这可能导致安全风险。现在,标准做法是撤销公共角色的 CREATE 权限,以限制对象创建,增强数据库安全性。
权限检查顺序与常见错误
在 PostgreSQL 中访问表时,权限检查按顺序进行:首先检查用户是否对模式拥有 USAGE 权限,然后检查是否对表拥有相应权限,最后检查列级权限。如果用户对模式没有 USAGE 权限,即使拥有表的所有权限,也会收到权限拒绝错误。因此,授予表权限时需确保同时授予模式 USAGE 权限。
预定义角色简化权限管理
PostgreSQL 提供预定义角色,如 pg_read_all_data 和 pg_write_all_data,可简化常用权限的授予。例如,为应用用户授予只读权限时,传统方法需对每个模式执行多个 GRANT 和 ALTER DEFAULT PRIVILEGES 命令,而使用预定义角色只需一条 GRANT 命令即可实现,大大减少了管理开销。
ALTER DEFAULT PRIVILEGES 的用途
ALTER DEFAULT PRIVILEGES 命令允许管理员为特定角色在模式中创建的对象定义默认访问权限。例如,可以设置当 developer 角色在 test 模式中创建新表时,自动将 SELECT 和 INSERT 权限授予 reporting 角色。这确保了新建对象具有一致的访问控制,避免了手动授予权限的重复工作。
Q&A
PostgreSQL中的用户、角色和组有什么区别?
在PostgreSQL中,用户、组和角色本质上是相同的,但用户默认可以登录。
如何在PostgreSQL中创建和分配角色?
使用CREATE ROLE命令创建角色,并通过GRANT命令将角色分配给用户。
什么是PUBLIC角色,它的作用是什么?
PUBLIC角色是一个特殊角色,授予系统中每个角色的权限,确保所有角色都有某些基本权限。
PostgreSQL提供哪些数据库级别的权限?
PostgreSQL提供连接、创建和临时表等数据库级别的权限。
ALTER DEFAULT PRIVILEGE命令的用途是什么?
ALTER DEFAULT PRIVILEGES命令允许管理员为特定角色创建的对象定义默认访问级别。
PostgreSQL中如何分配表级别的权限?
可以使用GRANT命令为用户分配SELECT、INSERT、UPDATE和DELETE等表级别的权限。