Oracle:自动删除并重新创建连接的用户

时间:2014-09-30 23:12:13

标签: oracle sqlplus

我正在尝试使用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

以上是什么问题?

1 个答案:

答案 0 :(得分:2)

上述脚本的主要问题是;不应该在动态SQL中。

但是,不要让那个骗过你,这仍然是一个难以置信的难题。不幸的是,Oracle系统很少频繁地删除和重新创建用户。这意味着你会遇到许多奇怪的错误。

我已经构建了脚本来执行此操作,但遗憾的是无法在此处共享它们。以下是您需要期待的一些有趣的事情:

  1. 杀死关联会话。
  2. 杀死阻止会话拥有的对象的其他会话。
  3. 截断临时表,因为它们具有奇怪的锁定规则。并使用它们查杀会话,请参阅如何在临时表中删除ORA-14452(文档ID 800506.1)。
  4. 在KILL语法中使用INST_ID,用于RAC。
  5. 循环整个过程几次,以防应用程序产生锁定对象的新会话。
  6. 如果您正在使用对象关系代码,请执行dbms_session.reset_package。令人惊讶的是,一些物品即使在掉落并重新创造它们的主人之后也能坚持下去。
  7. 如果它是一个复杂的应用程序,那么期望写出大约一百行代码。期待花几周的测试来摆脱一些奇怪的错误。期待它偶尔会失败。

    是的,这太荒谬了。 Oracle在快速创建新数据库方面投入了大量精力;可移动的表空间,可插拔的数据库,虚拟化等等。您认为有一种可靠的方法可靠地删除和重新创建用户!