2015-06-08 5 views
8

Я пытаюсь создать сценарий, который создаст пользователей , если они еще не существуют.Создание пользователя Oracle, если он еще не существует

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 Error: ORA-00922: missing or invalid option

Я был в состоянии сделать это в 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, чтобы проверить, пользователь уже существует, прежде чем пытаться создать нового пользователя?

+2

Использование EXECUTE IMMEDIATE – 6ton

ответ

11

Синтаксис IF NOT EXISTS, доступный на SQL Server, недоступен в Oracle.

В общем, сценарии Oracle просто выполняют оператор CREATE, и если объект уже существует, вы получите сообщение об ошибке, которое вы можете игнорировать. Это происходит во всех стандартных сценариях развертывания Oracle.

Однако, если вы действительно хотят, чтобы проверить наличие и выполнить только если объект не существует, что позволяет избежать ошибок, вы можете кодировать PL/SQL блок. Напишите SQL, который проверяет существование пользователя, и если он не существует, используйте EXECUTE IMMEDIATE, чтобы сделать CREATE USER из блока PL/SQL.

Пример такого/SQL блок PL может быть:

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

Надежда, что помогает.

3

Вам необходимо написать блок pl/sql. Смотрите пример here

Вы можете проверить, если пользователь существует в таблице all_users используя некоторые PL/SQL кода, как:

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

, а затем использовать v_count_user в состоянии, если условно выполнить команду создать заявление пользователя.

1

Из предыдущих ответов ясно, что 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 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production