【问题标题】:Creating an Oracle User if it doesn't already exist如果 Oracle 用户不存在,则创建它
【发布时间】:2015-06-08 13:53:08
【问题描述】:

我正在尝试创建一个脚本来创建用户如果他们不存在

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 中是否有类似的方法可以在尝试创建新用户之前检查用户是否已经存在?

【问题讨论】:

  • 使用立即执行

标签: oracle oracle11g createuser


【解决方案1】:

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

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

但是,如果您真的想要检查是否存在,并且仅在对象不存在时执行,从而避免错误,您可以编写PL/SQL堵塞。编写一个SQL 来检查用户是否存在,如果不存在,则使用EXECUTE IMMEDIATE 执行PL/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;
/

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      从前面的答案中,很明显if not exists 在 Oracle 中不受支持。澄清 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 上执行

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-20
          • 2012-11-01
          • 2016-09-18
          • 1970-01-01
          • 2011-12-26
          • 1970-01-01
          • 2014-05-21
          • 2020-07-12
          相关资源
          最近更新 更多