忽略 Oracle 中的用户存在错误

Ignoring User Exists Error in Oracle

我已经创建了一个脚本来创建 Oracle 用户和 g运行ts 他们的角色。我找不到忽略 "user exists" 错误的方法:

ORA-01920: user name '' conflicts with another user or role name.

我明白当脚本是 运行 时,用户可能已经存在,但是 我想忽略任何返回的错误。这可能吗?

我的 Oracle 代码:

CREATE USER "John" PROFILE "DEFAULT" IDENTIFIED BY "temppassword" ACCOUNT UNLOCK;

编辑: 这个问题不是问如果用户不存在如何创建用户。这个问题问的是如何忽略 "the user exists" 错误。根据之前提出的问题,最上面的答案是

In general, Oracle scripts simply execute the CREATE statement, and if the object already exist, you'll get an error indicating that, which you can ignore. This is whaat all the standard Oracle deployment scripts do.

为什么不能先查用户是否存在?

SELECT COUNT(*) 
INTO V_count 
from ALL_USERS 
where username = 'YourUserName'

IF v_count = 0 THEN
  --create the user
  --execute the grants
ELSE
  ---log that the user already exists
END IF;
SET SERVEROUTPUT ON;
    DECLARE
  TYPE t_list IS TABLE OF VARCHAR2 (30);
  l_list t_list := t_list ('X0', 'X1', 'X2');
  e_user_already_exists EXCEPTION;
  PRAGMA EXCEPTION_INIT (e_user_already_exists, -1920);
BEGIN
  FOR l_iterator IN 1 .. l_list.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE ('Creating user ' || l_list (l_iterator));
    BEGIN
      EXECUTE IMMEDIATE 'CREATE USER "' || l_list (l_iterator) || '" PROFILE DEFAULT IDENTIFIED BY "WELCOME" ACCOUNT UNLOCK';
      EXECUTE IMMEDIATE 'GRANT SOME_APPLICATION_ROLE TO ' || l_list (l_iterator);
    EXCEPTION
      WHEN e_user_already_exists THEN
        DBMS_OUTPUT.PUT_LINE ('User exists, ignored');
      WHEN OTHERS THEN
        RAISE;
    END;
  END LOOP;
END;
/

不清楚您是如何 运行 您的脚本,但假设它是通过 SQL*另外,您可以在 the whenever sqlerror command 遇到错误时修改行为。

如果您的脚本目前将其设置为 exit,或者您正在从启动脚本(login.sqlglogin.sql)中获取它,您可以将其改回, 或临时修改:

...
-- do not stop on error
WHENEVER SQLERROR CONTINUE;
CREATE USER "John" PROFILE "DEFAULT" IDENTIFIED BY "temppassword" ACCOUNT UNLOCK;
-- to stop when later errors are encountered
WHENEVER SQLERROR EXIT FAILURE;
ALTER USER ...

您仍会在输出中看到 ORA-01920,但它将继续执行下一条语句。此模式对于在尝试创建模式对象之前保护性删除模式对象也很有用。