12

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

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 にありますか?

4

4 に答える 4

19

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

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

ただし、実際に存在を確認し、オブジェクトが存在しない場合にのみ実行してエラーを回避したい場合は、PL/SQLブロックをコーディングできます。ユーザーの存在をチェックするaSQLを記述し、存在しない場合はブロックから実行するために使用EXECUTE IMMEDIATEします。CREATE USERPL/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;
/
于 2015-06-08T14:19:51.463 に答える
5

pl/sql ブロッ​​クを記述する必要があります。ここで例を見てください

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

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

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

于 2015-06-08T14:10:57.187 に答える
3

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 ビット製品で実行されました。

于 2016-11-25T09:47:28.947 に答える