Greenplum中对表批量授权

时间:2022-06-11
本文章向大家介绍Greenplum中对表批量授权,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

说明

  本文描述问题及解决方法同样适用于 腾讯云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');

注意

  • Snova中函数可见性是数据库内,因此如果要在其它数据库使用该函数,还需要在该数据库内运行上述代码
  • 该函数只会对当前schema下的表进行授权,授权后创建的表还需要再次进行操作