0

Oracle ユーザーを作成してロールを付与するスクリプトを作成しました。「ユーザーが存在します」というエラーを無視する方法が見つかりません。

ORA-01920: ユーザー名 '' が別のユーザーまたはロール名と競合しています。

スクリプトの実行時にユーザーが既に存在する可能性があることは理解していますが、返されたエラーは無視したいと考えています。これは可能ですか?

私のオラクルコード:

CREATE USER "John" PROFILE "DEFAULT" IDENTIFIED BY "temppassword" ACCOUNT UNLOCK;

編集: この質問は、ユーザーが存在しない場合にユーザーを作成する方法を尋ねているわけではありません。この質問は、「ユーザーが存在します」エラーを無視する方法を尋ねています。以前に尋ねられた質問によると、上位の回答は次のとおりです

一般に、Oracle スクリプトは単純に CREATE ステートメントを実行します。オブジェクトが既に存在する場合は、それを示すエラーが表示されますが、無視してかまいません。これは、すべての標準的な Oracle デプロイメント スクリプトが行うことです。

4

3 に答える 3

1
SET SERVEROUTPUT ON;
    DECLARE
  TYPE t_list IS TABLE OF VARCHAR2 (30);
  l_list t_list := t_list ('X0', 'X1', 'X2');
  e_user_already_exists EXCEPTION;
  PRAGMA EXCEPTION_INIT (e_user_already_exists, -1920);
BEGIN
  FOR l_iterator IN 1 .. l_list.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE ('Creating user ' || l_list (l_iterator));
    BEGIN
      EXECUTE IMMEDIATE 'CREATE USER "' || l_list (l_iterator) || '" PROFILE DEFAULT IDENTIFIED BY "WELCOME" ACCOUNT UNLOCK';
      EXECUTE IMMEDIATE 'GRANT SOME_APPLICATION_ROLE TO ' || l_list (l_iterator);
    EXCEPTION
      WHEN e_user_already_exists THEN
        DBMS_OUTPUT.PUT_LINE ('User exists, ignored');
      WHEN OTHERS THEN
        RAISE;
    END;
  END LOOP;
END;
/
于 2015-06-10T23:48:45.440 に答える
1

ユーザーが最初に存在するかどうかを確認できないのはなぜですか?

SELECT COUNT(*) 
INTO V_count 
from ALL_USERS 
where username = 'YourUserName'

IF v_count = 0 THEN
  --create the user
  --execute the grants
ELSE
  ---log that the user already exists
END IF;
于 2015-06-10T19:46:01.983 に答える
1

スクリプトをどのように実行しているかは明確ではありませんが、SQL*Plus 経由であると仮定するとwhenever sqlerrorコマンドでエラーが発生したときの動作を変更できます。

スクリプトがexit現時点でそれを設定している場合、または起動スクリプト ( login.sql, glogin.sql) からそれを取得している場合は、元に戻すか、一時的に変更できます。

...
-- do not stop on error
WHENEVER SQLERROR CONTINUE;
CREATE USER "John" PROFILE "DEFAULT" IDENTIFIED BY "temppassword" ACCOUNT UNLOCK;
-- to stop when later errors are encountered
WHENEVER SQLERROR EXIT FAILURE;
ALTER USER ...

出力には引き続き ORA-01920 が表示されますが、次のステートメントの実行が続行されます。このパターンは、スキーマ オブジェクトを作成する前に保護的に削除する場合にも役立ちます。

于 2015-06-11T13:24:39.897 に答える