2015-11-06 36 views
0

我有一个有点古怪的问题,当谈到甲骨文的角色和我的模式创建的代码,我会尽我所能来形容我下面的问题:问题与用户/系统的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一直在使用该角色来授予对其他用户和潜在附加软件包的访问权限,如果我们只是任意删除角色以重新创建,这些软件包将全部丢失它。

任何援助将不胜感激。

回答

0

你可以围绕你的角色像这样的东西创建:

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

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

您可以授予同样的特权,很多次,只要你喜欢。

+0

用已登录的用户,虽然我不能授予该角色,在这种情况下,我需要使用系统用户将其授予模式。我想要避免。 –

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