创建尚未存在的Oracle用户

5uzkadbs  于 2023-06-22  发布在  Oracle
关注(0)|答案(4)|浏览(169)

我正在尝试创建一个脚本,该脚本将创建用户**(如果用户不存在**)。

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中是否有类似的方法来检查用户是否已经存在,然后再尝试创建新用户?

lnxxn5zx

lnxxn5zx1#

在Oracle 23 c之前,SQL Server中可用的IF NOT EXISTS语法在Oracle中不可用。
一般来说,Oracle脚本只是执行CREATE语句,如果对象已经存在,您将得到一个错误,您可以忽略它。这是所有标准Oracle部署脚本所做的。
但是,如果你真的想检查对象是否存在,并且只在对象不存在的情况下执行,从而避免错误,你可以编写一个PL/SQL块。写一个SQL来检查用户是否存在,如果用户不存在,使用EXECUTE IMMEDIATEPL/SQL块中执行CREATE USER
这样的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 23 c开始,可以像这样创建用户:

create user if not exists smith identified by smith;
qqrboqgw

qqrboqgw2#

你需要写一个pl/sql块。参见示例here
您可以使用一些pl/sql代码检查用户是否存在于all_users表中,如:

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

然后在IF条件中使用v_count_user有条件地执行create user语句。

ffscu2ro

ffscu2ro3#

从前面的答案中可以清楚地看出,Oracle不支持if not exists。要澄清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 11 g Enterprise Edition Release 11.2.0.1.0 - 64 bit Production上执行的

jqjz2hbq

jqjz2hbq4#

另一种方法是在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;
/

相关问题