【问题标题】:Grant all on a specific schema in the db to a group role in PostgreSQL将数据库中特定模式的所有权限授予 PostgreSQL 中的组角色
【发布时间】:2012-05-08 07:45:52
【问题描述】:

使用 PostgreSQL 9.0,我有一个名为“staff”的组角色,并希望在特定模式中的表上向该角色授予所有(或某些)权限。以下均无效

GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;

“员工”的成员仍然无法对架构“foo”中的各个表或(在第二个命令的情况下)数据库中的任何表进行 SELECT 或 UPDATE 除非我授予该特定表上的所有权限。

我可以做些什么让我和我的用户的生活更轻松?

更新:a similar question on serverfault.com 的帮助下解决了这个问题。

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;

【问题讨论】:

    标签: postgresql database-design roles privileges grant


    【解决方案1】:

    您找到了为给定架构中的所有现有表设置权限的简写。 The manual clarifies:

    (但请注意,ALL TABLES 被认为包括视图外部表)。

    我的大胆强调。 serial 列在序列上使用nextval() 作为默认列实现,quoting the manual

    对于序列,此权限允许使用 currvalnextval 函数。

    因此,如果有 serial 列,您还需要在 sequences

    上授予 USAGE(或 ALL PRIVILEGES
    GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;
    

    注意:identity columns 在 Postgres 10 或更高版本中使用不需要额外权限的隐式序列。 (考虑升级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子句。

    【讨论】:

    • 只是让您了解 Erwin,在您发布建议 10 分钟后,我需要它。就像你知道我要做什么......创建一个新表并发现它没有正确的权限。你的答案来了。
    • @punkish:我要我的预知徽章! Damn, that's already used for something else.
    • 运行ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;的时候怎么知道是什么数据库? SCHEMA foo可以存在于不同的数据库中吗?
    • @J86:仅适用于 当前 数据库 - 执行命令的位置。
    • @ErwinBrandstetter 如果表将由另一个专用 migration_user 自动(flyway 迁移在应用启动时运行)?
    【解决方案2】:

    我的回答类似于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 专家Craig Ringerthe Answer

    现有对象与未来

    这些命令只影响现有对象。您将来创建的表等将获得默认权限,直到您重新执行上面的那些行。请参阅other answer by Erwin Brandstetter 更改默认值,从而影响未来的对象。

    【讨论】:

    • 除了上述两个授权外,还需要一个授权:GRANT USAGE ON SCHEMA public TO some_user_;
    • @NingLiu 非常感谢您指出 GRANT USAGE 并教我。我在答案中添加了一个部分。
    • GRANT USAGE ON SCHEMA 是我想要的。
    猜你喜欢
    • 2014-09-15
    • 2014-04-24
    • 2012-07-20
    • 2022-09-26
    • 2021-12-08
    • 2020-12-07
    • 2014-08-16
    相关资源
    最近更新 更多