首页 / 知识

从Oracle 10g数据库架构中删除连接的用户

2023-04-16 17:49:00

Dropping a connected user from an Oracle 10g database schema

是否有比重新启动Oracle数据库服务更好的方法来强制所有用户与Oracle 10g数据库架构断开连接?

我们有几个使用SQL Developer的开发人员连接到单个Oracle 10g服务器上的相同模式。 问题是,当我们要删除架构以重建它时,不可避免地有人仍在连接,并且在有人仍在连接时我们无法删除数据库架构或用户。

同样,我们也不想删除所有与其他模式的连接,因为其他人可能仍然可以连接并使用这些模式进行测试。

有人知道解决此问题的快速方法吗?


要查找会话,作为DBA使用

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

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

然后用杀死他们

alter system kill session ','

(e.g. alter system kill session '39,1232')

产生现成的kill-statement的查询可能是

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

这将为该用户在每个会话中返回一条kill语句-类似于:

alter system kill session '375,64855';

alter system kill session '346,53146';


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

1
2
3
4
5
6
7
8
9
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 Sessions

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

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

例如:
ALTER SYSTEM KILL会议'93,943';


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

1
2
3
4
5
6
7
8
9
DECLARE
   lc_username   VARCHAR2 (32) := 'user-name-to-kill-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;
/

只需使用SQL即可:

1
2
3
disconnect;

conn tiger/scott as sysdba;

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


只是我的两分钱:最好的方法(但短期内可能不是最快的方法)可能是每个开发人员都可以在自己的数据库实例上工作(有关数据库工作,请参见规则1)。

自从Oracle Database 10g Express Edition以来,在开发人员工作站上安装Oracle变得轻而易举。


您是否尝试过ALTER SYSTEM KILL SESSION?从V $ SESSION获取给定架构中每个会话的SID和SERIAL#,然后执行

ALTER SCHEMA KILL SESSION sid,序列号;


数据库用户连接删除

最新内容

相关内容

猜你喜欢