如何在Oracle中創建或替換角色(可能存在或可能不存在)?例如,下列不起作用:創建或替換角色?
CREATE OR REPLACE ROLE role_name;
GRANT SELECT ON SCM1_VIEW_OBJECT_VW TO role_name;
任何方式沒有PL/SQL做到這一點?
如何在Oracle中創建或替換角色(可能存在或可能不存在)?例如,下列不起作用:創建或替換角色?
CREATE OR REPLACE ROLE role_name;
GRANT SELECT ON SCM1_VIEW_OBJECT_VW TO role_name;
任何方式沒有PL/SQL做到這一點?
解決方案
給出答案的組合和附註控制完成這個任務的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;
沒有爲角色「創建或替換」的語法。不確定你的Oracle版本,但這並沒有太大的改變,我記得。 http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6012.htm
您可以多次向該角色授予select,並且每次提供角色時都會接受該授予。
如果角色已經存在,或者您通過查詢DBA_ROLES查看角色是否存在,您可以執行一個匿名塊並忽略該execption。
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;
/
最佳做法是嘗試創建角色,然後在出現時正確處理適當的異常;這意味着你不需要運行潛在的昂貴的數據字典的查詢:
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來做到這一點 - 它是這個職位的最佳工具,反正。
FOUT在蔥2: .ORA- 06550:第2行第3列: PLS-00103:Enc當期待以下某種情況時,會遇到符號「CREATE」:... – 2009-07-29 11:57:57
作爲一般規則,我不會將DDL放入函數中,您應該將其轉換爲過程。其次我真的沒有看到autonomous_transaction是什麼 - 你沒有DML交易。 – David 2009-07-30 02:21:17