PostgreSQL - 在*所有模式*中授予对所有表(和未来表)的选择

Posted

技术标签:

【中文标题】PostgreSQL - 在*所有模式*中授予对所有表(和未来表)的选择【英文标题】:PostgreSQL - Grant select on all tables (and future tables), in *all schemas* 【发布时间】:2018-03-19 18:43:52 【问题描述】:

我的数据库使用架构来分隔应用程序的特定于租户的数据 - 每个客户在注册时都会创建一个全新的架构来保存他们的数据。

这显然意味着我事先并不知道所有模式的名称。

我想创建一个readonly 角色,该角色对所有这些架构以及未来创建的架构具有读取权限。

我发现的所有这些问题都需要知道模式的名称,例如:

-- Create a group
CREATE ROLE readaccess;

-- Grant access to existing tables
GRANT USAGE ON SCHEMA a_given_schema TO readaccess;
GRANT SELECT ON ALL TABLES IN SCHEMA a_given_schema TO readaccess;

-- Grant access to future tables
ALTER DEFAULT PRIVILEGES IN SCHEMA a_given_schema GRANT SELECT ON TABLES TO readaccess;

-- Create user with password
CREATE USER readonly WITH PASSWORD 'a_secret';
GRANT readaccess TO readonly;

有没有办法做这样的事情,但对于未来的所有模式?

【问题讨论】:

【参考方案1】:

你不能这样做,就像这里所说的那样:grant usage & privileges on future created schema in PostgreSQL

最好换一种方式思考:每次创建架构时,都会同时授予角色:(查看链接了解更多信息)

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;

【讨论】:

以上是关于PostgreSQL - 在*所有模式*中授予对所有表(和未来表)的选择的主要内容,如果未能解决你的问题,请参考以下文章

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

PostgreSQL:将所有权限授予 PostgreSQL 数据库上的用户

授予 PostgreSQL 中特定数据库的权限

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

如果在包含架构上授予 USAGE 权限,Postgresql 将忽略缺少 EXECUTE 权限

在 PostgreSQL 中撤销另一个用户授予的权限