前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Greenplum中对表批量授权

Greenplum中对表批量授权

原创
作者头像
lambgong
修改2019-01-29 16:47:47
2.7K0
修改2019-01-29 16:47:47
举报

说明

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

代码语言:txt
复制
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下所有表的授权

代码语言:txt
复制
select grant_on_all_tables('schema_name','user_name');

注意

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
  • 背景
  • 方法
  • 注意
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档