使用PostgreSQL 9.0,我有一个名为“staff”的组角色,并希望在特定模式的表上授予此角色所有(或某些)特权 . 以下工作均不适用
GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;
"staff"的成员仍然无法对模式"foo"中的各个表进行SELECT或UPDATE,或者(对于第二个命令)无法对数据库中的任何表进行SELECT或UPDATE,除非我在该特定表上授予所有表 .
我能做些什么让我和我的用户的生活更轻松?
Update: 在a similar question on serverfault.com的帮助下想出来了 .
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;
2 回答
您找到了为给定模式中的所有现有表设置权限的简写 . The manual clarifies:
大胆强调我的 . serial 列使用
nextval()
实现,序列为列默认值,quoting the manual:因此,如果有
serial
列,您还需要在 sequences 上授予 USAGE (或ALL PRIVILEGES
)注意:Postgres 10或更高版本中的identity columns使用不需要其他权限的隐式序列 . (考虑升级
serial
列 . )新物体怎么样?
你也会对DEFAULT PRIVILEGES for users or schemas感兴趣:
这将为将来自动创建的对象设置权限 - 但不会为预先存在的对象设置权限 .
默认权限仅应用于目标用户创建的对象(
FOR ROLE my_creating_role
) . 如果省略该子句,则默认为执行ALTER DEFAULT PRIVILEGES
的当前用户 . 要明确:另请注意,pgAdmin III的所有版本都有一个微妙的错误,并在SQL窗格中显示默认权限,即使它们不适用于当前角色也是如此 . 复制SQL脚本时,请务必手动调整
FOR ROLE
子句 .我的回答类似于this one on ServerFault.com .
保守
如果你想比给予“所有特权”更保守,你可能想尝试更像这样的东西 .
public
的使用指的是为每个新数据库/目录创建的默认模式的名称 . 如果您创建了架构,请使用您自己的名称替换 .访问架构
要访问模式,对于任何操作,必须为用户授予“使用”权限 . 在用户可以选择,插入,更新或删除之前,必须首先向用户授予对模式的“使用” .
首次使用Postgres时,您不会注意到此要求 . 默认情况下,每个数据库都有一个名为
public
的第一个模式 . 默认情况下,每个用户都被自动授予该特定模式的"usage"权限 . 添加其他架构时,您必须明确授予使用权限 .摘自Postgres doc:
有关更多讨论,请参阅问题,What GRANT USAGE ON SCHEMA exactly do? . 请特别注意Postgres专家Craig Ringer的the Answer .
现有物体与未来
这些命令仅影响现有对象 . 您在将来创建的表等获得默认权限,直到您重新执行上述这些行 . 请参阅other answer by Erwin Brandstetter以更改默认值,从而影响将来的对象 .