一、目的
为了使用户权限最小化,一般我都都会给数仓中的每一层创建不同的用户,授予其基本权限,保证数据正常流通即可,因此如何授权、授权如何漂亮的写出来就是这里要说的....
二、授权逻辑
这里结合数仓常用习惯,简单说下授权逻辑。
数仓中每一层的数据,由下到上,越加精简。每层的各个用户之见,只需要上层用户可以获取下层用户所拥有的数据即可。因此,我们在授权时,只需要上层用户去获取下层用户所拥有权限的部分即可,实现权限最小化...
三、实现方式
/*
这里我们以user_ods ---> user_dw ---> user_dm三个用户为例。
当我们想要授予user_dw用户user_ods的部分权限时,我们只需要将下面的存储过程在ods用户下执行,参数为user_dw即可...
*/
create or replace procedure prc_grant_user_permission(
iv_user_name in varchar2
)
is
vv_user_name varchar2(20);
begin
vv_user_name := iv_user_name;
--对其他用户授予查询、修改表的权限
for table_tmp in(select table_name from user_tables) loop
execute immediate 'grant select,alter on '|| table_tmp ||' to '|| vv_user_name;
end loop;
--对其他用户授予执行存储过程、自定义函数的权限
for prc_tmp in(select object_name from user_procedure) loop
execute immediate 'grant execute on '|| prc_tmp ||' to '|| vv_user_name;
end loop;
--对其他用户授予同义词的权限
for syno_tmp in(select synonym_name from user_synonyms) loop
execute immediate 'grant execute on '|| syno_tmp ||' to '|| vv_user_name;
end loop;
end;
/
--执行
exec prc_grant_user_permission('user_dw');
exec prc_grant_user_permission('user_dm');
--删除授权存储过程
drop procedure prc_grant_user_permission;
注意:
--当我们遇到需要进行权限传递时,我们仅需要将存储过程中的动态sql修改即可
--授权语句:grant select on 表名 to 某用户 with grant option;
--撤销权限:revoke 权限 to 用户;