我正在尝试执行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天以来我一直在努力解决这个问题。请帮我解决这个问题。提前谢谢。
答案 0 :(得分:0)
ALTER SYSTEM KILL SESSION
不会立即摆脱会话。它只是标志着它被杀死。通常情况下,后台进程会在一分钟内消除它。如果有许多未提交的更改,则可能需要很长时间才能回滚所有内容。
没有办法加快这个过程。您可以做的最好的事情是忽略那些带有where v$session.status <> 'KILLED'
等谓词的会话。