2009-07-28 64 views
3

如何在Oracle中創建或替換角色(可能存在或可能不存在)?例如,下列不起作用:創建或替換角色?

CREATE OR REPLACE ROLE role_name; 
    GRANT SELECT ON SCM1_VIEW_OBJECT_VW TO role_name; 

任何方式沒有PL/SQL做到這一點?

回答

4

解決方案

給出答案的組合和附註控制完成這個任務的Oracle 10g。

CREATE OR REPLACE PROCEDURE create_role(role_name IN VARCHAR2) IS 
PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN 
    EXECUTE IMMEDIATE 'CREATE ROLE '||role_name; 
EXCEPTION 
    WHEN OTHERS THEN 
    -- ORA-01921: If The role name exists, ignore the error. 
    IF SQLCODE <> -01921 THEN 
     RAISE; 
    END IF; 
END create_role; 

測試

這個序列的工作原理:

DROP ROLE role_name; 
CREATE ROLE role_name; 
CALL create_role('role_name'); 
CALL create_role('role_name'); 

最後創建角色語句失敗,如預期:

DROP ROLE role_name; 
CALL create_role('role_name'); 
CREATE ROLE role_name; 
+0

作爲一般規則,我不會將DDL放入函數中,您應該將其轉換爲過程。其次我真的沒有看到autonomous_transaction是什麼 - 你沒有DML交易。 – David 2009-07-30 02:21:17

1

沒有爲角色「創建或替換」的語法。不確定你的Oracle版本,但這並沒有太大的改變,我記得。 http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6012.htm

您可以多次向該角色授予select,並且每次提供角色時都會接受該授予。

如果角色已經存在,或者您通過查詢DBA_ROLES查看角色是否存在,您可以執行一個匿名塊並忽略該execption。

2
DECLARE 
    v_dummy NUMBER; 
BEGIN 
    SELECT 1 
    INTO v_dummy 
    FROM dba_roles 
    WHERE role = 'MY_ROLE_NAME'; 
EXCEPTION 
    WHEN no_data_found THEN 
    EXECUTE IMMEDIATE 'CREATE ROLE my_role_name'; 
END; 
/
3

最佳做法是嘗試創建角色,然後在出現時正確處理適當的異常;這意味着你不需要運行潛在的昂貴的數據字典的查詢:

begin 
    execute immediate 'create role role_name'; 
exception 
    when others then 
    --"ORA-01921: role name 'x' conflicts with another user or role name" 
    if sqlcode = -01921 then 
     null; 
    else 
     raise; 
    end if; 
end; 

是的,你需要的PL/SQL來做到這一點 - 它是這個職位的最佳工具,反正。

+0

FOUT在蔥2: .ORA- 06550:第2行第3列: PLS-00103:Enc當期待以下某種情況時,會遇到符號「CREATE」:... – 2009-07-29 11:57:57