redshift 架构的只读权限
Posted
技术标签:
【中文标题】redshift 架构的只读权限【英文标题】:Readonly permissions for redshift schema 【发布时间】:2018-06-14 07:32:49 【问题描述】:我想授予只读权限以在 redshift 中分组。 我用了这个命令
GRANT USAGE ON SCHEMA myschema TO GROUP my_group;
GRANT SELECT ON ALL TABLES IN SCHEMA myschema TO GROUP my_group;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO GROUP my_group; REVOKE CREATE ON SCHEMA myschema FROM GROUP my_group;"
这可行,但看起来如果创建了新表,则用户没有这些表的权限
根据 AWS
IN SCHEMA 架构名称
可选。如果出现 IN SCHEMA 子句,则指定的 默认权限应用于在 指定的 架构名称。在这种情况下,作为目标的用户或用户组 的 ALTER DEFAULT PRIVILEGES 必须具有 CREATE 权限 指定的架构。特定于模式的默认权限是 添加到现有的全局默认权限。默认情况下,默认 权限全局应用于整个数据库。
这是否意味着我必须向该组授予 CREATE 权限?
【问题讨论】:
【参考方案1】:假设您使用 user_x 创建表,然后您想授予组 my_group 的 READ 权限,这是我通常用来实现此目的的命令:
ALTER DEFAULT PRIVILEGES FOR USER user_x IN SCHEMA myschema GRANT SELECT ON TABLES TO GROUP my_group;
【讨论】:
我希望如果任何用户创建表,那么它应该可以被组读取 不幸的是,我从未设法让它适用于所有用户。在我们的系统中,我们知道特定模式中的表是由 etl_user 创建的,因此我们明确知道谁在模式中创建表。【参考方案2】:这是一个添加只读用户组的存储过程。每当创建新架构或用户时,都必须运行此 SP(仅一次)
CREATE OR REPLACE PROCEDURE
public.grant_read_only_access_to_group(group_name varchar)
LANGUAGE plpgsql
AS $$
declare
s_name RECORD;
u_s RECORD;
begin
for s_name in select schema_name from SVV_REDSHIFT_SCHEMAS where schema_name not in ('information_schema','pg_catalog')
loop
execute 'REVOKE CREATE ON SCHEMA ' || quote_ident(s_name.schema_name)|| ' FROM GROUP '|| group_name;
execute 'GRANT USAGE ON SCHEMA '|| quote_ident(s_name.schema_name)||' TO GROUP ' || group_name;
execute 'GRANT SELECT ON ALL TABLES IN SCHEMA '|| quote_ident(s_name.schema_name)||' TO GROUP '|| group_name;
execute 'ALTER DEFAULT PRIVILEGES IN SCHEMA ' || quote_ident(s_name.schema_name)||' GRANT SELECT ON TABLES TO GROUP ' || group_name;
end loop;
for u_s in select u.usename n , s.schema_name s ,has_schema_privilege(u.usename,s.schema_name, 'create') c
from pg_user u cross join SVV_REDSHIFT_SCHEMAS s
where schema_name not in ('information_schema','pg_catalog')
and usesysid > 1
loop
if u_s.c = true then
execute 'ALTER DEFAULT PRIVILEGES FOR USER '||u_s.n||' IN SCHEMA ' || quote_ident(u_s.s)||' GRANT SELECT ON TABLES TO GROUP ' || group_name;
end if;
end loop;
end;
$$;
如何使用 SP 的示例: 只读创建组;
call grant_read_only_access_to_group('readonly');
CREATE USER readonly_user WITH PASSWORD 'pwd';
ALTER GROUP readonly ADD USER readonly_user;
【讨论】:
以上是关于redshift 架构的只读权限的主要内容,如果未能解决你的问题,请参考以下文章
ALTER SCHEMA NAME 是不是会影响对 Redshift 中架构的权限授予