我正在尝试创建一个脚本,如果用户尚未存在,则会创建。
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是否有类似的方法来检查用户是否已存在?
答案 0 :(得分:14)
SQL Server中提供的IF NOT EXISTS
语法在Oracle中不可用。
通常,Oracle脚本只执行CREATE
语句,如果该对象已存在,您将收到一条错误,指出您可以忽略的错误。这就是所有标准Oracle部署脚本的功能。
但是,如果 确实 想要检查是否存在,并且仅在对象不存在时执行,从而避免错误,则可以编写{{1阻止。写一个PL/SQL
来检查用户是否存在,如果它不存在,请使用SQL
从EXECUTE 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;
/