我正在尝试使用Oracle删除连接的用户。由于Oracle是一款出色的软件产品,因此这个问题已被问及7亿次以上。但是,我发现所有的答案都需要用户输入,并且不能在发布时自动执行。典型的答案在此陈述如下:https://stackoverflow.com/a/15665694/177293Oracle:自动删除并重新创建连接的用户
我想在没有人介入的脚本中这样做。所以,我想是这样的:
BEGIN
FOR i IN (
SELECT sid, serial# from v$session where username = 'MYUSER'
) LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || i.sid || ',' || i.serial# || ''';';
END LOOP;
END;
其中,欢快,在在sqlplus结果:
BEGIN
*
ERROR at line 1:
ORA-00911: invalid character
ORA-06512: at line 5
尝试一个稍微不同的策略:
BEGIN
FOR i IN (
SELECT
'alter system kill session ''' || sid || ',' || serial# || ''';'
from v$session where username = 'MYUSER'
) LOOP
EXECUTE IMMEDIATE ''|| i ||'';
END LOOP;
END;
结果:
EXECUTE IMMEDIATE ''|| i ||'';
*
ERROR at line 7:
ORA-06550: line 7, column 21:
PLS-00306: wrong number or types of arguments in call to '||'
ORA-06550: line 7, column 3:
PL/SQL: Statement ignored
我希望有af如下所示:
#!/bin/sh
sqlplus system/manager <<EOT
BEGIN
FOR i IN (
SELECT sid, serial# FROM v$session WHERE username = 'MYUSER'
) LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || i.sid || ',' || i.serial# || ''';';
END LOOP;
END;
DROP USER MYUSER CASCADE;
DROP TABLESPACE MYUSER INCLUDING CONTENTS AND DATAFILES;
CREATE USER MYUSER IDENTIFIED BY password;
ALTER USER MYUSER IDENTIFIED BY password;
GRANT connect, resource TO MYUSER;
exit;
EOT
上面出现了什么问题?
我不明白为什么你认为应该很容易将活动用户放在活动系统中,而活动系统中的对象实际上可能正在被应用程序使用。看起来像是一件应该很难的事情。 – 2014-10-01 02:34:27
既然你的意图是放弃整个架构,也许首先撤销用户对象上的所有授权将会很有帮助。然后,您无法在其他帐户中锁定这些对象的新会话。 – 2014-10-01 02:37:02
@DaveCosta我明白了你的观点,通常很难删除或删除正在使用的内容。但问题的一部分是Oracle对什么是“主动”有模糊的定义,特别是对于临时表。即使在没有任何活动事务的情况下,会话也可以阻止事物,这真的很烦人。 – 2014-10-01 03:18:46