Oracle用户名模式匹配 - 适用于分阶段环境中的不同用户名

时间:2014-12-04 09:30:44

标签: regex oracle oracle11g permissions username

我习惯在所有数据库中为应用程序进程使用相同的用户名 - 这样您就可以部署存储过程并授予其权限,并且可以在任何地方使用相同的脚本。

我正在尝试解决的问题是授予权限 - 方案是:

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克)

2 个答案:

答案 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');

将授予权限