我正在尝试使用Oracle DROP一个连接的用户。由于Oracle是一款出色的软件产品,因此这个问题已被提出超过7亿次。但是,我找到的所有答案都需要用户输入,并且无法自动发布。这里有一个典型的答案:https://stackoverflow.com/a/15665694/177293
我想在脚本中执行此操作,而无需人工干预。所以,我尝试这样:
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
我希望有一个看起来像这样的完成脚本:
#!/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
以上是什么问题?
答案 0 :(得分:2)
上述脚本的主要问题是;
不应该在动态SQL中。
但是,不要让那个骗过你,这仍然是一个难以置信的难题。不幸的是,Oracle系统很少频繁地删除和重新创建用户。这意味着你会遇到许多奇怪的错误。
我已经构建了脚本来执行此操作,但遗憾的是无法在此处共享它们。以下是您需要期待的一些有趣的事情:
dbms_session.reset_package
。令人惊讶的是,一些物品即使在掉落并重新创造它们的主人之后也能坚持下去。如果它是一个复杂的应用程序,那么期望写出大约一百行代码。期待花几周的测试来摆脱一些奇怪的错误。期待它偶尔会失败。
是的,这太荒谬了。 Oracle在快速创建新数据库方面投入了大量精力;可移动的表空间,可插拔的数据库,虚拟化等等。您认为有一种可靠的方法可靠地删除和重新创建用户!