授予对 PostgreSQL 中未来创建的模式的使用和特权

Posted

技术标签:

【中文标题】授予对 PostgreSQL 中未来创建的模式的使用和特权【英文标题】:grant usage & privileges on future created schema in PostgreSQL 【发布时间】:2015-10-16 14:38:04 【问题描述】:

我现在正在集成的应用程序将创建新模式。 (每个客户都有自己的架构,例如schema1、schema2、schema3 ....etc) 为了授予对新创建的架构和架构中特定表的使用和只读访问权限,我执行以下命令:

GRANT USAGE ON SCHEMA schema1 TO read_only_user;
GRANT SELECT ON schema1.talbe1 TO read_only_user;
GRANT SELECT ON schema1.table2 TO read_only_user;

GRANT USAGE ON SCHEMA schema2 TO read_only_user;
GRANT SELECT ON schema2.talbe1 TO read_only_user;
GRANT SELECT ON schema2.table2 TO read_only_user;

(......and so on.....)

我只是想知道我是否可以。只能找到改变未来创建的表而不是未来创建的模式的默认权限的方法。

【问题讨论】:

【参考方案1】:

模式没有默认权限。但是,由于您使用的模型是每个用户都有自己的架构,因此您可以自动化整个过程,包括创建用户和设置密码(如果需要):

CREATE FUNCTION new_user_schema (user text, pwd text) RETURNS void AS $$
DECLARE
  usr name;
  sch name;
BEGIN
  -- Create the user
  usr := quote_identifier(user);
  EXECUTE format('CREATE ROLE %I LOGIN PASSWORD %L', usr, quote_literal(pwd));

  -- Create the schema named after the user and set default privileges
  sch := quote_identifier('sch_' || user);
  EXECUTE format('CREATE SCHEMA %I', sch);
  EXECUTE format('ALTER SCHEMA %I OWNER TO %L', sch, usr);
  EXECUTE format('ALTER DEFAULT PRIVILEGES IN SCHEMA %I
                    GRANT SELECT ON TABLES TO %L', sch, usr);
END; $$ LANGUAGE plpgsql STRICT;

然后您可以使用简单的命令创建用户、创建架构并设置默认权限:

SELECT new_user_schema('new_user', 'secret');

【讨论】:

感谢您的回答。赞赏。 感谢您的回答。赞赏。但是我的问题是,我无法控制何时创建新的数据库架构,并且我授予使用权限的只读用户不是架构所有者(我也无法控制原始架构所有者)。所以我想我需要一个自动化的过程来检测创建的​​模式并将使用/选择授予只读用户。 那么谁来执行GRANT 命令呢?由于它显然不是模式所有者,因此它必须是超级用户角色。架构本身是如何创建的? 有一个超级用户角色来创建新架构,但是当超级用户创建新架构时,我无法控制他们的代码。所以我认为我需要创建一些自动检测或一些触发器检测创建的​​新模式,然后将使用/选择授予另一个只读用户。挑战是超级用户创建新模式时我无法更改代码:(或者有没有办法在超级用户帐户中添加一些代码,所以每当超级用户创建新模式时,它会在创建新模式后执行 GRANT 命令。谢谢这么多。

以上是关于授予对 PostgreSQL 中未来创建的模式的使用和特权的主要内容,如果未能解决你的问题,请参考以下文章

授予对 PostgreSQL 中未来表的权限?

Postgres:为不同角色/用户创建的未来表授予对角色/用户的访问权限

将“创建模式”数据库授予用户?

PostgreSQL 8.4 将所有表的 DML 权限授予一个角色

是否可以在数据库中任何模式的所有未来表上授予 SELECT 权限?

PostgreSQL 授予对表的访问权限