4

Oracleで(存在する場合も存在しない場合もある)ロールをどのように作成または置換しますか?たとえば、次は機能しません。

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

PL / SQLなしでこれを行う方法はありますか?

4

4 に答える 4

5

解決

与えられた回答とプラグマコントロールの組み合わせにより、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;
于 2009-07-29T21:31:17.353 に答える
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が必要です。とにかく、これはこのジョブに最適なツールです。

于 2009-07-29T11:00:47.667 に答える
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;
/
于 2009-07-29T06:09:54.380 に答える
1

ロールの「作成または置換」の構文はありません。Oracleのバージョンはわかりませんが、思い出せるほどの変化はありません。http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6012.htm

選択をロールに複数回付与することができ、ロールが存在する場合は毎回付与を受け入れます。

匿名ブロックを実行し、ロールがすでに存在する場合は実行を無視するか、DBA_ROLESにクエリを実行してロールが存在するかどうかを確認する他の方法を実行できます。

于 2009-07-29T02:32:48.080 に答える