用户/系统oracle角色访问和权限的问题

时间:2015-11-06 15:28:59

标签: oracle

关于oracle角色和我的架构创建代码,我有一个奇怪的问题,我会尽力描述下面的问题:

在架构创建时,使用提供的架构名称创建角色。

EXECUTE IMMEDIATE 'CREATE ROLE ' || USER || 'ADMIN_R'; 

然后,将此角色授予与该架构关联的特定用户。

DECLARE  
    V_ROLE_NAME       CONSTANT VARCHAR2(30)   := USER || 'ADMIN_R';  
    CURSOR C_ADMIN_USERS IS  
        SELECT USERNAME FROM DBUSERS WHERE ROLE = 'ADMINISTRATION';  
BEGIN   
    FOR REC IN C_ADMIN_USERS  
    LOOP  
        EXECUTE IMMEDIATE 'GRANT ' || V_ROLE_NAME || ' TO ' || REC.USERNAME || ' WITH ADMIN OPTION';  
    END LOOP;  
END; 

具有此角色的用户可以访问特殊管理包。

EXECUTE IMMEDIATE 'GRANT EXECUTE ON P_ADMINISTRATION TO ' || USER || 'ADMIN_R';

问题是当我删除模式时它不会删除此角色(属于oracle),因此当我重新创建此模式时,整个过程将失败,因为此角色已存在。如果不登录我想避免的系统用户,我也无法授予对此角色的访问权限。简单的解决方案就是删除它,但我在那个实例中的关注点是DBA一直在使用该角色授予对其他用户和可能的附加包的访问权限,如果我们只是随意删除角色来重新创建,那么这些包都会丢失它

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用以下内容围绕您的角色创建:

Array.prototype.splice

您可以根据需要多次授予相同的权限。

答案 1 :(得分:0)

您可以在创建

之前删除该角色
declare
  i int;
begin
  select count(*) into i 
    from dba_roles where role = USER||'ADMIN_R';

  if (0 != i) then
    execute immediate 'drop role '||USER||'ADMIN_R';
    dbms_output.put_line('Role ' ||USER||'ADMIN_R has been dropped');
  end if;

  execute immediate 'create role '||USER||'ADMIN_R';
  dbms_output.put_line('Role ' ||USER||'ADMIN_R has been created');

end;

第一次尝试:

Role SCMADMIN_R has been created

第二次尝试:

Role SCMADMIN_R has been dropped
Role SCMADMIN_R has been created