0

我创建了一个脚本来创建 Oracle 用户并授予他们角色。我无法找到忽略“用户存在”错误的方法:

ORA-01920: 用户名 '' 与另一个用户名或角色名冲突。

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

我的甲骨文代码:

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

编辑: 这个问题不是问如果用户不存在如何创建用户。这个问题是询问如何忽略“用户存在”错误。根据先前提出的问题,最重要的答案是

通常,Oracle 脚本只执行 CREATE 语句,如果对象已经存在,您将收到一个错误指示,您可以忽略它。这是所有标准 Oracle 部署脚本所做的。

4

3 回答 3

1

为什么你不能先找到用户是否存在?

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;
于 2015-06-10T19:46:01.983 回答
1
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;
/
于 2015-06-10T23:48:45.440 回答
1

目前尚不清楚您是如何运行脚本的,但假设它是通过 SQL*Plus 运行的,您可以在whenever sqlerrorcommand遇到错误时修改行为。

如果您的脚本目前正在将其设置为exit,或者您正在从启动脚本 ( login.sql, glogin.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,但它将继续执行下一条语句。此模式对于在尝试创建模式对象之前保护性删除也很有用。

于 2015-06-11T13:24:39.897 回答