使用PostgreSQL 9.0,我有一个名为“staff”的组角色,并希望在特定模式的表上授予此角色所有(或某些)特权。以下工作都不是
GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;
“staff”的成员仍然无法对模式“foo”中的各个表进行SELECT或UPDATE,或者(对于第二个命令)无法对数据库中的任何表进行SELECT或UPDATE,除非 I在该特定表格上授予所有权利。
我能做些什么让我和我的用户的生活更轻松?
更新:在a similar question on serverfault.com的帮助下计算出来。
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;
答案 0 :(得分:97)
您找到了为给定架构中的所有现有表设置权限的简写。 The manual clarifies:
(但请注意,
ALL TABLES
被视为包含观看和外国表)。
大胆强调我的。 serial
列在序列上使用nextval()
作为列默认值实现,quoting the manual:
对于序列,此权限允许使用
currval
和nextval
函数。
因此,如果有serial
列,您还需要在序列上授予 USAGE
(或ALL PRIVILEGES
)
GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;
注意:Postgres 10或更高版本中的identity columns使用不需要其他权限的隐式序列。 (考虑升级serial
列。)
您还会对DEFAULT PRIVILEGES
for users or schemas:
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT USAGE ON SEQUENCES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo REVOKE ...;
这将自动为将来创建的对象设置权限 - 但不为预先存在的对象设置权限。
默认权限仅应用于目标用户(FOR ROLE my_creating_role
)创建的对象。如果省略该子句,则默认为执行ALTER DEFAULT PRIVILEGES
的当前用户。要明确:
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo GRANT ...;
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo REVOKE ...;
另请注意,pgAdmin III的所有版本在SQL窗格中都有一个微妙的错误和显示默认权限,即使它们不适用于当前角色也是如此。复制SQL脚本时,请务必手动调整FOR ROLE
子句。
答案 1 :(得分:34)
我的回答类似于this one on ServerFault.com。
如果你想比给予“所有特权”更保守,你可能想尝试更多这样的事情。
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO some_user_;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO some_user_;
public
的使用指的是为每个新数据库/目录创建的默认模式的名称。如果您创建了架构,请使用您自己的名称替换。
要访问模式,对于任何操作,必须为用户授予“使用”权限。在用户可以选择,插入,更新或删除之前,必须首先向用户授予对模式的“使用”。
首次使用Postgres时,您不会注意到此要求。默认情况下,每个数据库都有一个名为public
的第一个模式。默认情况下,每个用户都被自动授予该特定模式的“使用”权限。添加其他架构时,您必须明确授予使用权限。
GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;
摘自Postgres doc:
对于模式,允许访问指定模式中包含的对象(假设还满足对象自己的特权要求)。从本质上讲,这允许被授权者在模式中“查找”对象。没有这个权限,仍然可以看到对象名称,例如通过查询系统表。此外,在撤消此权限后,现有后端可能具有先前已执行此查找的语句,因此这不是一种完全安全的方法来阻止对象访问。
有关更多讨论,请参阅问题What GRANT USAGE ON SCHEMA exactly do?。由Postgres专家the Answer特别关注Craig Ringer。
这些命令仅影响现有对象。您在将来创建的表等获得默认权限,直到您重新执行上述这些行。请参阅other answer by Erwin Brandstetter以更改默认值,从而影响将来的对象。