2015-06-08 11 views
8

Sto cercando di creare uno script che creerà gli utenti se non esistono già. è datoCreazione di un utente Oracle se non esiste già

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

il seguente errore:

SQL Error: ORA-00922: missing or invalid option

ero in grado di fare questo in SQL Server 2008 utilizzando:

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 

C'è un modo simile in Oracle per verificare se un utente esiste già prima di tentare di creare un nuovo utente?

+2

Uso ESEGUIRE IMMEDIATO – 6ton

risposta

11

La sintassi IF NOT EXISTS disponibile in SQL Server non è disponibile in Oracle.

In generale, gli script Oracle eseguono semplicemente l'istruzione CREATE e, se l'oggetto esiste già, verrà visualizzato un errore che indica che è possibile ignorarlo. Questo è esattamente ciò che fanno tutti gli script di distribuzione standard di Oracle.

Tuttavia, se si davvero desidera controllare per l'esistenza, ed eseguire solo se oggetto non esiste, evitando in tal modo l'errore, è possibile codificare un blocco PL/SQL. Scrivi un SQL che verifica la presenza dell'utente, e se non esiste, usa EXECUTE IMMEDIATE per fare CREATE USER dal blocco PL/SQL.

Un esempio di tale blocco PL/SQL potrebbe essere:

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

Speranza che aiuta.

3

È necessario scrivere un blocco pl/sql. Vedere un esempio here

È possibile controllare se l'utente esiste nella tabella ALL_USERS usando un certo codice PL/SQL come:

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

e quindi utilizzare v_count_user in una condizione IF per eseguire in modo condizionale la dichiarazione all'utente di creare.

1

Dalle risposte precedenti, è chiaro che if not exists non è supportato in Oracle. Per chiarire che l'errore (s) sono gettati da Oracle quando si tenta di creare un utente già esistente (e come bonus, quando si tenta di eliminare un utente non esistente):

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 

Le dichiarazioni di cui sopra sono stati eseguiti su Oracle Database 11g Enterprise Edition versione 11.2.0.1.0 - Produzione a 64 bit