Oracleで(存在する場合も存在しない場合もある)ロールをどのように作成または置換しますか?たとえば、次は機能しません。
CREATE OR REPLACE ROLE role_name;
GRANT SELECT ON SCM1_VIEW_OBJECT_VW TO role_name;
PL / SQLなしでこれを行う方法はありますか?
解決
与えられた回答とプラグマコントロールの組み合わせにより、Oracle10gのこのタスクが実行されます。
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' );
予想どおり、最後のcreateroleステートメントは失敗します。
DROP ROLE role_name;
CALL create_role( 'role_name' );
CREATE ROLE role_name;
ベストプラクティスは、ロールの作成を試み、発生した場合は適切な例外を適切に処理することです。これは、潜在的に高価なデータディクショナリクエリを実行する必要がないことを意味します。
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が必要です。とにかく、これはこのジョブに最適なツールです。
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;
/
ロールの「作成または置換」の構文はありません。Oracleのバージョンはわかりませんが、思い出せるほどの変化はありません。http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6012.htm
選択をロールに複数回付与することができ、ロールが存在する場合は毎回付与を受け入れます。
匿名ブロックを実行し、ロールがすでに存在する場合は実行を無視するか、DBA_ROLESにクエリを実行してロールが存在するかどうかを確認する他の方法を実行できます。