【问题标题】:ALTER SYSTEM is not executing in jrubyALTER SYSTEM 未在 jruby 中执行
【发布时间】:2014-01-23 13:18:34
【问题描述】:

我正在尝试执行 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. 我能够以 'dummypass' 作为密码以 ABC 和 XYZ 身份登录到 db。因此我知道 ALTER USER 语句已成功运行。 2. 对于“ABC”和“XYZ”,我仍然看到所有相同的会话 ID 和序列号。因此我知道 ALTER SYSTEM 语句没有运行。

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

【问题讨论】:

  • 它可以在 JRuby 之外工作吗?
  • 是的,我将它作为一个单独的 plsql 块运行,它工作正常。

标签: oracle plsql jruby


【解决方案1】:

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

没有办法加快这个过程。你能做到的最好的就是忽略那些带有where v$session.status &lt;&gt; 'KILLED'之类的谓词的会话。

【讨论】:

  • 我更新了ALTER SYSTEM KILL SESSION,添加了 where 子句来检查状态。这次我收到以下 SQL 错误:NativeException: java.sql.SQLException: ORA-00026: missing or invalid session ID ORA-06512: at line 15。我查看了每个用户的状态,它被标记为“KILLED”。我该如何解决这个问题?
  • 将条件添加到光标而不是ALTER
  • 我尝试添加以下内容:CURSOR sess_cur IS IF(v$session.status &lt;&gt; 'KILLED') THEN SELECT sid, serial# FROM v$session WHERE username like ('ABC'); END IF;,但它给出了以下错误:NativeException: java.sql.SQLException: ORA-06550: line 5, column 12: PLS-00103: Encountered the symbol "IF" when expecting one of the following: ( select &lt;a SQL statement&gt;。游标条件有语法问题吗?
  • 试试这个:SELECT sid, serial# FROM v$session WHERE username like ('ABC') and status &lt;&gt; 'KILLED'.
  • 是的,我试过了,它给出了以下错误消息:NativeException: java.sql.SQLException: ORA-00026: missing or invalid session ID ORA-06512: at line 15。我在运行脚本之前检查了用户的状态,它是INACTIVE。运行脚本后,状态为KILLED。我的最终目标是在终止所有会话后删除特定用户。但我现在被困在杀戮会话中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 2020-03-14
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多