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_1
和 user_2
不属于 admin_me 组。
谢谢!
这里存在一个根本性的误解:架构上的特权不会决定或影响该架构中 table 的权限或所有权。
如果用户 A 是 admin
组的成员,并且该组对架构具有 CREATE
权限,则用户 A 可以在该架构中创建 table。 但是 table 将属于 A,而不属于 admin
。
现在只有 table 的所有者或超级用户可以 ALTER
或 DROP
GRANT
的 table 权限。这就是为什么 admin
和该组中的其他用户无法更改对 table.
的权限的原因
如果您只需要更改权限,您可以 运行 以用户 A 的身份执行以下操作:
GRANT ALL ON TABLE newtab TO admin WITH GRANT OPTION;
然后 admin
的任何成员都可以管理 table 的权限。没有将 ALTER TABLE
或 DROP 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();
我是 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_1
和 user_2
不属于 admin_me 组。
谢谢!
这里存在一个根本性的误解:架构上的特权不会决定或影响该架构中 table 的权限或所有权。
如果用户 A 是 admin
组的成员,并且该组对架构具有 CREATE
权限,则用户 A 可以在该架构中创建 table。 但是 table 将属于 A,而不属于 admin
。
现在只有 table 的所有者或超级用户可以 ALTER
或 DROP
GRANT
的 table 权限。这就是为什么 admin
和该组中的其他用户无法更改对 table.
如果您只需要更改权限,您可以 运行 以用户 A 的身份执行以下操作:
GRANT ALL ON TABLE newtab TO admin WITH GRANT OPTION;
然后 admin
的任何成员都可以管理 table 的权限。没有将 ALTER TABLE
或 DROP 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();