所以我有一个配置了oracle数据库的AWS RDS服务器实例,我试图强行断开给定用户的所有连接,这样我就可以删除该用户并重新创建用户了。模式。
根据AWS RDS文档,而不是使用
ALTER SYSTEM KILL SESSION ' sid, serial#' immediate
我们应该使用
exec rdsadmin.rdsadmin_util.kill(sid, serial#)
请参阅Amazon's documentation here
所以,我已经尝试了以下两种方法来杀死所有连接,但它们都不起作用:
BEGIN
for session_to_drop in (select 'exec rdsadmin.rdsadmin_util.kill('|| sid ||',' || serial# || ')' command from v$session where username in ('SCHEMA_NAME'))
loop
dbms_output.put_line(session_to_drop.command);
execute immediate session_to_drop.command;
end loop;
end;
Error report -
ORA-00900: invalid SQL statement
ORA-06512: at line 5
00900. 00000 - "invalid SQL statement"
*Cause:
*Action:
exec rdsadmin.rdsadmin_util.kill(22,48087)
BEGIN
for session_to_drop in (select sid, serial# from v$session where username in ('PERFLAB')) loop
dbms_output.put_line('exec rdsadmin.rdsadmin_util.kill(' || session_to_drop.sid || ',' || session_to_drop.serial# ||')');
exec rdsadmin.rdsadmin_util.kill(session_to_drop.sid, session_to_drop.serial#);
end loop;
end;
Error report -
ORA-06550: line 4, column 10:
PLS-00103: Encountered the symbol "RDSADMIN" when expecting one of the following:
:= . ( @ % ;
The symbol ":=" was substituted for "RDSADMIN" to continue.
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
理想情况下,这些循环会遍历所有当前连接并杀死每个连接;但是,似乎exec命令在循环中没有得到识别。
还有其他人能够解决这个问题吗?
答案 0 :(得分:4)
您不在PL / SQL块中使用exec
。 exec
是SQL * Plus命令,它不是SQL或PL / SQL语言的一部分。您只需在循环中调用该过程
BEGIN
for session_to_drop in (select sid, serial#
from v$session
where username in ('PERFLAB'))
loop
rdsadmin.rdsadmin_util.kill(session_to_drop.sid, session_to_drop.serial#);
end loop;
end;
我猜你会想要在你杀死会话之前锁定帐户,以防止用户在你杀死会话的过程中重新登录。
答案 1 :(得分:0)
使用call
代替exec
,为我工作(JDBC连接)。
即
-- select username, sid, serial#, status, machine
-- from v$session where username is not null;
call rdsadmin.rdsadmin_util.kill(123, 45678);