创建Oracle用户(如果尚不存在)

时间:2015-06-08 13:53:09

标签: oracle oracle11g createuser

我正在尝试创建一个脚本,如果用户尚未存在,则会创建

if ((x + position) > len(dnArray)):
                                    break

给出以下错误:

  

SQL错误:ORA-00922:缺少或无效选项

我可以使用以下命令在SQL Server 2008中执行此操作:

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'
)

在尝试创建新用户之前,Oracle是否有类似的方法来检查用户是否已存在?

4 个答案:

答案 0 :(得分:14)

SQL Server中提供的IF NOT EXISTS语法在Oracle中不可用。

通常,Oracle脚本只执行CREATE语句,如果该对象已存在,您将收到一条错误,指出您可以忽略的错误。这就是所有标准Oracle部署脚本的功能。

但是,如果 确实 想要检查是否存在,并且仅在对象不存在时执行,从而避免错误,则可以编写{{1阻止。写一个PL/SQL来检查用户是否存在,如果它不存在,请使用SQLEXECUTE IMMEDIATE块执行CREATE USER

此类PL / SQL块的示例可能是:

PL/SQL

希望有所帮助。

答案 1 :(得分:5)

您需要编写一个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语句。

答案 2 :(得分:3)

从前面的答案可以看出,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 11g企业版11.2.0.1.0版 - 64位生产

上执行

答案 3 :(得分: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;
/