12

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

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 中是否有类似的方法来检查用户是否已经存在?

4

4 回答 4

19

IF NOT EXISTSSQL Server 中可用的语法在 Oracle 中不可用。

一般来说,Oracle 脚本只是简单地执行CREATE语句,如果对象已经存在,你会得到一个错误指示,你可以忽略它。这是所有标准 Oracle 部署脚本所做的。

但是,如果你真的想检查是否存在,并且只在对象不存在时执行,从而避免错误,你可以编写一个PL/SQL块。编写一个SQL检查用户是否存在的代码,如果它不存在,则使用从块EXECUTE IMMEDIATE中执行。CREATE USERPL/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;
/
于 2015-06-08T14:19:51.463 回答
5

您需要编写一个 pl/sql 块。在此处查看示例

您可以使用以下 pl/sql 代码检查用户是否存在于 all_users 表中:

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

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

于 2015-06-08T14:10:57.187 回答
3

从前面的答案可以看出,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 上执行

于 2016-11-25T09:47:28.947 回答
1

另一种方法是在 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;
/
于 2019-10-08T16:52:28.560 回答