Alter System在Jruby中没有执行



我正在尝试执行我有更改用户的PLSQL块,然后再一次更改系统语句。Alter用户正在执行,但Alter系统不是。

我的代码执行以下操作:1.使用JDBC驱动程序连接到数据库。2.更改特定用户的登录用户(在这里我使用Alter用户语句)。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.我可以以" dummypass"作为密码登录为ABC和XYZ。因此,我知道Alter用户报表已成功运行。2.我仍然看到所有相同的会话ID和序列#S用于" ABC"one_answers" XYZ"。因此,我知道Alter System语句没有运行。

自过去三天以来,我一直在努力解决这个问题。请帮助我解决此问题。预先感谢。

ALTER SYSTEM KILL SESSION不会立即摆脱会话。它仅标志着它被杀死。通常,背景过程将在一分钟内摆脱它。如果有很多不承诺的更改,可能需要很长时间才能回滚一切。

没有办法加快过程。最好的做法可以忽略这些会话,例如where v$session.status <> 'KILLED'

最新更新