2015-06-08 14 views
8

Próbuję utworzyć skrypt, który utworzy użytkowników , jeśli jeszcze nie istnieją.Tworzenie użytkownika Oracle, jeśli jeszcze nie istnieje

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

następujący błąd jest podana:

SQL Error: ORA-00922: missing or invalid option

udało mi się to zrobić w SQL Server 2008 za pomocą:

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 

Czy istnieje podobny sposób w Oracle w celu sprawdzenia, czy użytkownik już istnieje przed próbą utworzenia nowego użytkownika?

+2

Użyj WYKONAJ NATYCHMIAST – 6ton

Odpowiedz

11

Składnia IF NOT EXISTS dostępna w SQL Server nie jest dostępna w Oracle.

Ogólnie, skrypty Oracle po prostu wykonują instrukcję CREATE, a jeśli obiekt już istnieje, otrzymasz komunikat o błędzie, który możesz zignorować. Tak właśnie działają standardowe skrypty Oracle.

Jeśli jednak naprawdę chcą sprawdzić istnienia, a jedynie wykonywać, jeśli obiekt nie istnieje, przez co unika się błędu, można zakodować PL/SQL blok. Napisz kod SQL, który sprawdza istnienie użytkownika, a jeśli nie istnieje, użyj EXECUTE IMMEDIATE, aby wykonać z bloku PL/SQL.

Przykładem takiego bloku PL/SQL może być:

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

nadzieję, że pomoże.

3

Musisz napisać blok PL/SQL. Zobacz przykład here

Można sprawdzić, czy użytkownik istnieje w tabeli all_users używając kodu PL/SQL, takich jak:

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

a następnie użyć v_count_user w warunku IF warunkowo wykonanie CREATE użytkownika.

1

Z poprzednich odpowiedzi wynika, że ​​if not exists nie jest obsługiwane w Oracle. Wyjaśnienie, jakie błąd (s) są wyrzucane przez Oracle podczas próby utworzenia już istniejącego użytkownika (i jako bonus, gdy próbuje zrzucić non istniejącego użytkownika):

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 

Powyższe realizowane były na Oracle Database 11g Enterprise Edition Wydanie 11.2.0.1.0 - Produkcja 64-bitowa