本文描述问题及解决方法同样适用于 腾讯云Snova云数仓。
DBA在管理数据仓库的时候,往往会创建多个帐号,每个帐号有不同的用途。因此这里就有不同帐号间表授权的需求。
对单个表授权,可以使用 GRANT ALL ON TABLE {tablename} TO {username},那如果需要批量操作某个schema下所有表权限呢?
在PostgreSQL 9.0之后,可以使用类似GRANT ALL ON ALL TABLES IN SCHEMA {schemaname} TO {username}完成上述功能。由于Snova目前基于PostgreSQL 8.3.23,还不支持上述语法(后续会升级到9.+,敬请期待!)。但可以通过手动编写函数,来实现类似语法。
创建以下函数,语法可参见PL/pgSQL语法
create or replace function grant_on_all_tables(schema text, usr text)
returns setof text as $$
declare
r record ;
grantstmt text;
begin
for r in select * from pg_class c, pg_namespace nsp
where c.relnamespace = nsp.oid AND c.relkind='r' AND nspname = schema
loop
grantstmt = 'GRANT SELECT ON "'|| quote_ident(schema) || '"."' ||
quote_ident(r.relname) || '" to "' || quote_ident(usr) || '"';
EXECUTE grantstmt;
return next grantstmt;
end loop;
end;
$$ language plpgsql;
简单解释一下以上代码,该函数接受2个参数,schema text : 需要授权的schema名称,usr text : 需要授权的role名称,然后代码会遍历参数schema下的所有表,轮询的去做授权操作。
运行以上代码,就可以使用如下语法完成对某个schema下所有表的授权
select grant_on_all_tables('schema_name','user_name');
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。