ユーザーを作成するスクリプトを作成しようとしていますユーザーがまだ存在しない場合。
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で、新しいユーザーを作成する前にユーザーが既に存在するかどうかを確認する同様の方法はありますか?
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;
/
お役に立てば幸いです。
Pl/sqlブロックを記述する必要があります。例を見る ここ
次のようなpl/sqlコードを使用して、ユーザーがall_usersテーブルに存在するかどうかを確認できます。
SELECT count(*) INTO v_count_user
FROM all_users
WHERE username = 'Kyle'
次に、IF条件でv_count_userを使用して、条件付きでcreate userステートメントを実行します。
以前の回答から、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ビット製品で実行されました
これを行う別の方法は、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;
/