【发布时间】: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 块运行,它工作正常。