我习惯在所有数据库中为应用程序进程使用相同的用户名 - 这样您就可以部署存储过程并授予其权限,并且可以在任何地方使用相同的脚本。
我正在尝试解决的问题是授予权限 - 方案是:
GRANT EXECUTE ON b.procedure_name TO APP_USER_DEV
我正在开发一个Oracle数据库,无论出于何种原因,DBA决定在流程的每个阶段使用不同的用户名。所以你有类似的东西:
APP_USER_DEV
APP_USER_TEST
APP_USER_PROD
这有点愚蠢,但在我的势力范围之外。给柠檬的时候,我们做柠檬水!所以这里有机会做一些有点创意的事情。
现在我想继续使用一个脚本。我团队中的初级开发人员自然会说:
如果每个环境都有不同的用户名,那么我们需要为每个环境使用不同的脚本。
我可以理解逻辑,但这有点风险,我认为我们可以做得更好,即所有环境都有一个脚本。
我想要做的是使用正则表达式来对用户名进行部分匹配。在Sybase上,我会做类似的事情:
declare @myusername varchar(20)
select @myusername = user_name from sys.sysuserperm where user_name like 'APP_USER_%'
GRANT EXECUTE ON b.procedure_name TO @myusername
我的问题是 - 如何在Oracle上执行此操作? (11克)
答案 0 :(得分:0)
declare
v_procedure_name varchar2(100) := 'my_proc';
begin
for c in (select username from all_users where username like 'APP_USER_%') loop
execute immediate 'grant execute on '||v_procedure_name||' to '||c.username;
end loop;
end;
编辑: 具有硬编码的proc-name且没有循环的版本
declare
v_user_name varchar2(100) ;
begin
select username
into v_user_name
from all_users
where username like 'APP_USER_%';
execute immediate 'grant execute on my_proc to '||v_user_name;
end;
答案 1 :(得分:0)
您可以在此处使用动态查询EXECUTE IMMEDIATE
,如下所示
create or replace procedure grantuser(user varchar2)
IS
BEGIN
EXECUTE IMMEDIATE 'GRANT EXECUTE ON procedure_name to' || user;
END;
只需调用上述程序,如
exec grantuser('APP_USER_DEV');
将授予权限