有没有可能在oracle中杀死一个查询而不杀死会话?

t30tvxxf  于 2023-06-05  发布在  Oracle
关注(0)|答案(4)|浏览(564)

我希望能够在Oracle www.example.com中杀死用户的查询10.2.0.4不会杀死他们的整个会话。这将允许查询结束,但不会使该用户退出其会话,因此他们可以继续进行其他查询。这可能吗?还是说,终止会话是结束查询执行的唯一方法?

ipakzgxi

ipakzgxi1#

我发现了一个窍门。我不知道玩这个有多安全,但它确实有效。有一个Oracle事件10237,它被描述为“模拟^C(用于测试目的)”。
您必须具有要中断的会话的SID和SERIAL#。
调用SYS.DBMS_SYSTEM.SET_EV(sidserial#,10237,1,'')以激活目标会话中的事件。应中断任何当前正在执行的语句(接收“ORA-01013:用户请求取消当前操作”)。只要设置了该事件,会话尝试执行的任何其他语句都将立即终止,并返回相同的错误。
要停用该事件,请使用设置为“0”的第四个参数进行相同的调用。然后会话将能够再次执行语句。
请注意,目标会话必须检测到事件已设置,这可能需要时间,也可能永远不会发生,具体取决于它正在执行的操作。所以你不能只是快速切换事件的开关。您需要打开它,验证有问题的语句是否已停止,然后关闭它。
下面是一些示例代码。这意味着在SQLPlus中作为匿名块运行,并适当定义了替换变量“sid”和“serial”。您可以将其转换为一个存储过程,并将这些参数作为其参数。

DECLARE
  l_status  v$session.status%TYPE;
BEGIN

  dbms_system.set_ev( &sid, &serial, 10237, 1, '');

  LOOP
    SELECT status INTO l_status FROM v$session
      WHERE sid = &sid and serial# = &serial;
    EXIT WHEN l_status='INACTIVE';
  END LOOP;

  dbms_system.set_ev( &sid, &serial, 10237, 0, '');
END;
li9yvcax

li9yvcax2#

我怀疑这是可能的,因为你可以在TOAD中做到这一点。当查询正在运行时,会出现一个“取消”对话框,您可以点击该对话框停止查询。
我不知道它是如何实现的,但我也很想知道。
如果你使用的是java,那么java.sql.Statementcancel()方法就是用来完成这个任务的。在这里查看一些注意事项和限制...
http://download.oracle.com/docs/cd/B14117_01/java.101/b10979/tips.htm#BACDAICJ

vd8tlhqk

vd8tlhqk3#

从18 c开始,您可以使用以下命令终止单个查询而不会终止整个会话:

ALTER SYSTEM CANCEL SQL 'SID, SERIAL, @INST_ID, SQL_ID';

上面的命令可能在12.2中工作,但在该版本中没有记录。
在18 c之前,理想地,用户的应用应当具有取消查询的能力(经由OCICancel或等效物)。
否则,最好使用资源管理器(如果在Oracle EE上),您可以使用DBMS_RESOURCE_MANAGER.SWITCH_CONSUMER_GROUP_FOR_SESS将目标会话设置为使用者组CANCEL_SQL。
取消其他会话查询的另一种方法是使用kill -URG向Oracle进程发送紧急信号(这是一种方法,不适用于日常使用)。
我写过为什么它在这里工作:
http://blog.tanelpoder.com/2010/02/17/how-to-cancel-a-query-running-in-another-session/

mm5n2pyu

mm5n2pyu4#

您可以查看资源限制:
“如果用户超出调用级别资源限制,Oracle将暂停语句的处理,回滚语句并返回错误。但是,当前事务的所有先前语句保持不变,并且用户的会话保持连接。
这假设取消SQL的原因是资源限制,而不是更新错误的行集(例如)。我怀疑您无法通过添加资源限制来影响当前正在运行的SQL。

http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/security.htm#i13767
http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/dbrm.htm#i1010776

相关问题