我正在尝试执行我有更改用户的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'
。