2015-11-06 40 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