PostgreSQL 默认权限不适用于其他用户

PostgreSQL Default Permissions not applying to other users

我是 RDBMS 世界的初学者,并已开始使用 PgAdmin 4 与 PostgreSQL 合作。我的任务是为我的团队管理数据库,并已开始学习权限。

我偶然发现了模式的默认权限 属性。我知道此处定义的权限适用于在模式中创建的任何对象。我已经为团队数据库的管理员(我目前是其中的唯一成员)创建了一个组角色,以防我将来更改角色或其他任何角色。通过这种方式,可以将新用户添加到该管理员组,而无需在我离开时手动将其添加到每个单独对象的权限中。已将所有权限(包括 GRANT)作为默认 table 权限应用到此管理组的所有模式。

但是,我发现当具有 CREATE 权限的其他用户向模式添加新的 table 时,不会应用默认权限。即使作为架构的所有者,我也看不到或访问我的队友正在创建的 table 的任何属性。我不得不要求超级用户帐户手动添加我才能修复这些 table 的权限。

我的问题是:为什么我定义的默认权限没有应用于为其他用户创建的对象。有没有办法确保所有用户都遵守同一组默认权限?

这是我一直在使用的 SQL 语句:

GRANT ALL ON SCHEMA "schema_name" TO "user_1"

GRANT ALL ON SCHEMA "schema_name" TO "user_1"

ALTER DEFAULT PRIVILEGES IN SCHEMA "schema_name"
GRANT ALL ON TABLES TO "admin_me" WITH GRANT OPTION;

ALTER DEFAULT PRIVILEGES IN SCHEMA "schema_name"
GRANT SELECT ON TABLES TO "user_1";

ALTER DEFAULT PRIVILEGES IN SCHEMA "schema_name"
GRANT SELECT ON TABLES TO "user_2";

其中 admin_me 是我所在的组,user_1user_2 不属于 admin_me 组。

谢谢!

这里存在一个根本性的误解:架构上的特权不会决定或影响该架构中 table 的权限或所有权。

如果用户 A 是 admin 组的成员,并且该组对架构具有 CREATE 权限,则用户 A 可以在该架构中创建 table。 但是 table 将属于 A,而不属于 admin

现在只有 table 的所有者或超级用户可以 ALTERDROP GRANT 的 table 权限。这就是为什么 admin 和该组中的其他用户无法更改对 table.

的权限的原因

如果您只需要更改权限,您可以 运行 以用户 A 的身份执行以下操作:

GRANT ALL ON TABLE newtab TO admin WITH GRANT OPTION;

然后 admin 的任何成员都可以管理 table 的权限。没有将 ALTER TABLEDROP TABLE 委托给其他人的选项。

感谢 Laurenz Albe 解释默认权限。我设法使用事件触发器找到了我的问题的解决方案(也感谢 Laurenz Albe)。我创建了一个事件触发器来响应 CREATE TABLE 标签并执行一个触发器函数来授予“默认”权限。

CREATE OR REPLACE FUNCTION trg_create_table_func()
RETURNS event_trigger
LANGUAGE plpgsql
AS
$$
DECLARE obj record;
BEGIN
    FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag in ('CREATE TABLE')
        LOOP
            EXECUTE format('GRANT ALL ON TABLE %s TO "admin_me" WITH GRANT OPTION;', obj.object_identity);
            EXECUTE format('GRANT SELECT ON TABLE %s TO "team_group";', obj.object_identity);
        END LOOP;
END;
$$;

CREATE EVENT TRIGGER trg_create_table ON ddl_command_end
WHEN TAG IN ('CREATE TABLE')
EXECUTE PROCEDURE trg_create_table_func();