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

用户/系统oracle角色访问和权限问题,oracle,Oracle,当涉及到oracle角色和模式创建代码时,我遇到了一个有点奇怪的问题,我将尽力在下面描述我的问题: 在架构创建中,使用提供的架构名称创建角色 EXECUTE IMMEDIATE 'CREATE ROLE ' || USER || 'ADMIN_R'; 然后将此角色授予与该架构关联的特定用户 DECLARE V_ROLE_NAME CONSTANT VARCHAR2(30) := USER || 'ADMIN_R'; CURSOR C_ADMIN_USE

当涉及到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一直在使用该角色来授予其他用户和潜在的其他包的访问权限,如果我们只是随意删除该角色以重新创建它,这些都将丢失


如蒙协助,将不胜感激

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

SELECT COUNT(*) 
INTO v_count
FROM DBA_ROLES
WHERE ROLE = USER || 'ADMIN_R';

IF v_count = 0 THEN
--grant your roles
END IF;

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

您可以在创建之前删除角色

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

但是,我无法使用登录用户授予该角色,在这种情况下,我需要使用系统用户将其授予架构。这是我想要避免的。