ALTER SYSTEM没有在jruby中执行

时间:2014-01-22 19:25:17

标签: oracle plsql jruby

我正在尝试执行plsql块,其中我有ALTER USER,然后是ALTER SYSTEM语句。 ALTER USER正在执行但ALTER SYSTEM不是。

我的代码执行以下操作: 1.使用jdbc驱动程序连接到数据库。 2.更改特定用户的登录用户(这里我使用的是ALTER USER语句)。 3.在删除之前杀死该特定用户的会话(这里我使用的是未运行的ALTER SYSTEM语句)。

下面是没有为我运行的代码片段。

users = ['ABC', 'XYZ']

$users.each do|x|
          if( is_usr?("#{x}") )
               puts "Working on #{x}"

               stmt = <<-EOF
                         DECLARE
                                   id NUMber(10);
                                     s_num NUMBER(10);
                                     CURSOR cur IS
                                     SELECT sid, serial#
                                     FROM v$session WHERE username like ('#{x}');

                         BEGIN
                                    OPEN cur;
                                    LOOP
                                        FETCH cur INTO id, s_num;
                                        dbms_output.put_line(id||' '||s_num);
                                        EXECUTE IMMEDIATE 'ALTER USER #{x} IDENTIFIED BY dummypass';
                                        EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' ||id|| ',' ||s_num||'''';
                                        EXIT when sess_cur%notfound;
                                    END LOOP;
                                   CLOSE cur;
                               END;
                      EOF

                 puts "#{stmt}"
                 plsql = @conn.create_statement
                 plsql.execute_update(stmt)

                 else
                      puts "#{x} does not exist"
                 end
end

输出如下:

Working on ABC

                            DECLARE
                                                                id NUMber(10);
                                                                s_num NUMBER(10);
                                                                CURSOR cur IS
                                                                        SELECT sid, serial#
                                                                        FROM v$session WHERE username like ('ABC');

                                                        BEGIN
                                                                OPEN cur;
                                                                LOOP
                                                                        FETCH cur INTO id, s_num;
                                                                        dbms_output.put_line(id||' '||s_num);
                                                                        EXECUTE IMMEDIATE 'ALTER USER ABC IDENTIFIED BY dummypass';
                                                                        EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' ||id|| ',' ||s_num||'''';
                                                                        EXIT when sess_cur%notfound;
                                                                END LOOP;
                                                                CLOSE cur;
                                                        END;

Working on XYZ
                                                       DECLARE
                                                                id NUMber(10);
                                                                s_num NUMBER(10);
                                                                CURSOR cur IS
                                                                        SELECT sid, serial#
                                                                        FROM v$session WHERE username like ('XYZ');

                                                        BEGIN
                                                                OPEN cur;
                                                                LOOP
                                                                        FETCH cur INTO id, s_num;
                                                                        dbms_output.put_line(id||' '||s_num);
                                                                        EXECUTE IMMEDIATE 'ALTER USER XYZ IDENTIFIED BY dummypass';
                                                                        EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' ||id|| ',' ||s_num||'''';
                                                                        EXIT when sess_cur%notfound;
                                                                END LOOP;
                                                                CLOSE cur;
                                                        END;

运行此脚本后的观察: 1.我可以使用&#39; dummypass&#39;以ABC和XYZ身份登录db。作为密码。因此我知道ALTER USER语句已成功运行。 2.我仍然看到所有相同的会话ID和序列#s用于&#39; ABC&#39;和&#39; XYZ&#39;。因此我知道ALTER SYSTEM语句没有运行。

自从过去3天以来我一直在努力解决这个问题。请帮我解决这个问题。提前谢谢。

1 个答案:

答案 0 :(得分:0)

ALTER SYSTEM KILL SESSION不会立即摆脱会话。它只是标志着它被杀死。通常情况下,后台进程会在一分钟内消除它。如果有许多未提交的更改,则可能需要很长时间才能回滚所有内容。

没有办法加快这个过程。您可以做的最好的事情是忽略那些带有where v$session.status <> 'KILLED'等谓词的会话。