web-dev-qa-db-fra.com

Création d'un utilisateur Oracle s'il n'existe pas déjà

J'essaie de créer un script qui créera des utilisateurs s'ils n'existent pas déjà.

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'
)

L'erreur suivante est donnée:

Erreur SQL: ORA-00922: option manquante ou non valide

J'ai pu le faire dans SQL Server 2008 en utilisant:

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

Existe-t-il un moyen similaire dans Oracle pour vérifier si un utilisateur existe déjà avant de tenter de créer un nouvel utilisateur?

12
Kyle Williamson

Le IF NOT EXISTS la syntaxe disponible dans SQL Server n'est pas disponible dans Oracle.

En général, les scripts Oracle exécutent simplement l'instruction CREATE, et si l'objet existe déjà, vous obtiendrez une erreur indiquant cela, que vous pouvez ignorer. C'est ce que font tous les scripts de déploiement Oracle standard.

Cependant, si vous vraiment voulez vérifier l'existence, et n'exécutez que si l'objet n'existe pas, évitant ainsi l'erreur , vous pouvez coder un PL/SQL bloquer. Écrivez un SQL qui vérifie l'existence de l'utilisateur et s'il n'existe pas, utilisez EXECUTE IMMEDIATE faire CREATE USER du PL/SQL bloquer.

Un exemple d'un tel bloc PL/SQL pourrait être:

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;
/

J'espère que cela pourra aider.

14
Mark J. Bobak

Vous devez écrire un bloc pl/sql. Voir un exemple ici

Vous pouvez vérifier si l'utilisateur existe dans la table all_users en utilisant du code pl/sql comme:

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

puis utilisez v_count_user dans une condition IF pour exécuter conditionnellement l'instruction create user.

5
6ton

D'après les réponses précédentes, il est clair que if not exists n'est pas pris en charge dans Oracle. Pour clarifier les erreurs générées par Oracle lors de la tentative de création d'un utilisateur déjà existant (et en bonus, lors de la tentative de suppression d'un utilisateur non existant):

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

Les instructions ci-dessus ont été exécutées sur Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

3
Emil G

Une autre façon de le faire est de créer l'utilisateur dans un bloc PL/SQL et de détecter l'erreur ORA-01920. De cette façon, le bloc ne génère aucune erreur lorsque l'utilisateur existe.

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
Nicholas Sushkin