programing

Oracle User가 없는 경우 생성

newsource 2023. 9. 7. 21:43

Oracle User가 없는 경우 생성

사용자가 존재하지 않는 경우 사용자를 생성할 스크립트를 생성하려고 합니다.

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에서도 새 사용자를 만들기 전에 사용자가 이미 존재하는지 확인하는 비슷한 방법이 있습니까?

Oracle 23c 이전에는IF NOT EXISTSSQL Server에서 사용할 수 있는 구문은 Oracle에서 사용할 수 없습니다.

일반적으로 Oracle 스크립트는 단순히CREATEstatement. 개체가 이미 존재하는 경우 무시할 수 있는 오류가 나타납니다.이것은 모든 표준 Oracle 배포 스크립트가 수행하는 작업입니다.

그러나 존재 여부를 확인하고 개체가 존재하지 않는 경우에만 실행하여 오류를 방지하려면 a를 코드화할 수 있습니다.PL/SQL블락. 글을 써라.SQL사용자 존재 여부를 확인하고, 존재하지 않는 경우 사용합니다.EXECUTE IMMEDIATE하기 위해서CREATE USER로부터PL/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;
/

Oracle 23c 이후로 다음과 같이 사용자를 생성할 수 있습니다.

create user if not exists smith identified by smith;

pl/sql 블록을 작성해야 합니다.여기서 예제 보기

다음과 같은 pl/sql 코드를 사용하여 all_users 테이블에 사용자가 있는지 확인할 수 있습니다.

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

그런 다음 IF 조건에서 v_count_user를 사용하여 create user 문을 조건부로 실행합니다.

이전의 답변들로 볼 때, 다음과 같은 것이 명백합니다.if not existsOracle에서는 지원되지 않습니다.이미 존재하는 사용자를 생성하려고 할 때 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 Release 11.2.0.1.0 - 64bit Production에서 실행되었습니다.

다른 방법은 PL/SQL 블록에 사용자를 생성하여 ORA-01920 오류를 잡는 것입니다.이렇게 하면 블록은 사용자가 존재할 때 어떠한 오류도 던지지 않습니다.

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

언급URL : https://stackoverflow.com/questions/30710990/creating-an-oracle-user-if-it-doesnt-already-exist