从Oracle 10g数据库模式中删除连接的用户

有没有比重启Oracle数据库服务更有效地将所有用户与Oracle 10g数据库模式断开连接的方法?

我们有几个开发人员使用SQL Developer连接到单个Oracle 10g服务器上的相同模式。 问题是,当我们想删除模式来重build它时,不可避免地有人仍然连接着,而当有人仍然连接时,我们不能删除数据库模式或用户。

同样的道理,我们不想放弃与其他模式的所有连接,因为其他人可能仍然连接并testing这些模式。

任何人都知道解决这个问题的快速方法?

作为DBA使用来查找会话

select sid,serial# from v$session where username = '<your_schema>'

如果您只想确保使用SQL Developer的会话,则可以添加and program = 'SQL Developer' 。 如果您只想要os_user属于特定开发人员的会话,则可以在os_user上添加限制

然后杀了他们

alter system kill session '<sid>,<serial#>'

(例如, alter system kill session '39,1232'

产生预先build立的kill语句的查询可以是

select 'alter system kill session ''' || sid || ',' || serial# || ''';' from v$session where username = '<your_schema>'

这将为该用户的每个会话返回一个kill语句 – 如下所示:

alter system kill session '375,64855';

alter system kill session '346,53146';

使用此查询查find数据库的现有会话:

 SELECT s.inst_id, s.sid, s.serial#, p.spid, s.username, s.program FROM gv$session s JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id WHERE s.type != 'BACKGROUND'; 

你会看到下面的东西。 Oracle会话

然后,使用从上述结果中提取的值运行以下查询。

 ALTER SYSTEM KILL SESSION '<put above s.sid here>,<put above s.serial# here>'; 

例如: ALTER SYSTEM KILL SESSION'93,943';

我的build议是这个简单的匿名块:

 DECLARE lc_username VARCHAR2 (32) := 'your user name here'; BEGIN FOR ln_cur IN (SELECT sid, serial# FROM v$session WHERE username = lc_username) LOOP EXECUTE IMMEDIATE ('ALTER SYSTEM KILL SESSION ''' || ln_cur.sid || ',' || ln_cur.serial# || ''' IMMEDIATE'); END LOOP; END; / 

确保在杀死它们之前更改系统并启用受限会话,否则在完成工作之前会快速重新login到数据库。

只是使用SQL:

 disconnect; conn tiger/scott as sysdba; 

仅仅是我的两分钱:最好的方法(但可能不是最快的)可能是每个开发人员在他自己的数据库实例上工作(请参阅数据库工作规则1 )。

从Oracle数据库10g速成版以来,在开发人员站点上安装Oracle已经变得毫无意义。

你有没有试过ALTER SYSTEM KILL SESSION? 从V $ SESSION获取给定模式中的每个会话的SID和SERIAL#,然后执行

ALTER SCHEMA KILL SESSION sidserial# ;