web-dev-qa-db-ja.com

まだ存在しない場合のOracleユーザーの作成

ユーザーを作成するスクリプトを作成しようとしていますユーザーがまだ存在しない場合

CREATE USER "Kyle" PROFILE "DEFAULT" IDENTIFIED BY "password" ACCOUNT UNLOCK
WHERE NOT IN  //Also tried 'WHERE NOT EXISTS'
(
    SELECT username FROM all_users WHERE username = 'Kyle'
)

次のエラーが表示されます。

SQLエラー:ORA-00922:オプションがないか、無効です

SQL Server 2008でこれを行うには、以下を使用しました。

IF NOT EXISTS
(SELECT name FROM master.sys.server_principals
WHERE name = 'Kyle')
BEGIN
    CREATE LOGIN Kyle WITH PASSWORD = 'temppassword' MUST_CHANGE, CHECK_EXPIRATION=ON, CHECK_POLICY=ON
END

Oracleで、新しいユーザーを作成する前にユーザーが既に存在するかどうかを確認する同様の方法はありますか?

12
Kyle Williamson

SQL Serverで使用可能なIF NOT EXISTS構文は、Oracleでは使用できません。

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

ただし、reallyが存在するかどうかを確認し、オブジェクトが存在しない場合にのみ実行して、エラーを回避する場合、PL/SQLブロックをコーディングできます。ユーザーの存在を確認するSQLを記述し、存在しない場合はEXECUTE IMMEDIATEを使用してCREATE USERブロックからPL/SQLを実行します。

このようなPL/SQLブロックの例は次のとおりです。

declare
userexist integer;
begin
  select count(*) into userexist from dba_users where username='SMITH';
  if (userexist = 0) then
    execute immediate 'create user smith identified by smith';
  end if;
end;
/

お役に立てば幸いです。

14
Mark J. Bobak

Pl/sqlブロックを記述する必要があります。例を見る ここ

次のようなpl/sqlコードを使用して、ユーザーがall_usersテーブルに存在するかどうかを確認できます。

SELECT count(*) INTO v_count_user
FROM all_users
WHERE username = 'Kyle'

次に、IF条件でv_count_userを使用して、条件付きでcreate userステートメントを実行します。

5
6ton

以前の回答から、if not existsはOracleではサポートされていません。既存のユーザーを作成しようとしたときに(また、既存のユーザーを削除しようとしたときにボーナスとして)Oracleによってスローされるエラーを明確にするには:

drop user foo;
ORA-01918: user 'foo' does not exist

create user existing_user IDENTIFIED BY existing_user;
ORA-01920: user name 'existing_user' conflicts with another user or role name

上記のステートメントは、Oracle Database 11g Enterprise Editionリリース11.2.0.1.0-64ビット製品で実行されました

3
Emil G

これを行う別の方法は、PL/SQLブロックでユーザーを作成し、ORA-01920エラーをキャッチすることです。これにより、ユーザーが存在する場合でもブロックはエラーをスローしません。

DECLARE
    sqlStatement varchar2(512);
    user_exists EXCEPTION;
    PRAGMA EXCEPTION_INIT(user_exists, -1920);
BEGIN
    sqlStatement := 'CREATE USER "Kyle" ' ||
       'IDENTIFIED BY "password" ' ||
       'PROFILE "Default" ' ||
       'ACCOUNT UNLOCK';
    EXECUTE IMMEDIATE sqlStatement;
    dbms_output.put_line('  OK: ' || sqlStatement);
EXCEPTION
   WHEN user_exists THEN
     dbms_output.put_line('WARN: ' || sqlStatement);
     dbms_output.put_line('Already exists');
   WHEN OTHERS THEN
     dbms_output.put_line('FAIL: ' || sqlStatement);
     RAISE;
END;
/
1