我正在尝试创建一个脚本,如果用户还不存在,他们就会创建。
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:缺失或无效选项
我能够在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中是否有类似的方法来检查用户是否已经存在?
发布于 2015-06-08 06:19:51
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;
/
发布于 2015-06-08 06:10:57
您需要编写pl/sql块。参见这里示例
可以使用一些pl/sql代码检查用户是否存在于all_users表中,如下所示:
SELECT count(*) INTO v_count_user
FROM all_users
WHERE username = 'Kyle'
然后在IF条件下使用v_count_user有条件地执行create语句。
发布于 2016-11-25 01:47:28
从前面的答案可以清楚地看出,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数据库11g企业版11.2.0.1.0 -64位产品上执行的。
https://stackoverflow.com/questions/30710990
复制相似问题