PostgreSQL - 在所有表格(以及将来的表格)中选择Grant,在*所有模式中*

时间:2017-10-08 13:14:24

标签: sql postgresql schema

我的数据库使用模式为应用程序分离特定于租户的数据 - 每个客户在注册保存数据时都会创建一个全新的模式。

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

我想创建一个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 个答案:

答案 0 :(得分:2)

你不能这样做,如下所述: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;