Oracle 如何创建一个触发器,使其在完成之前不会保存整个事务?

Oracle 如何创建一个触发器,使其在完成之前不会保存整个事务?,oracle,plsql,triggers,Oracle,Plsql,Triggers,对于一个表,中间有一个插入操作的过程。该表包含一个触发器,因此整个事务将被保留。是否有其他方法可以使触发器在单独的会话上运行,并在插入操作后运行程序,而无需等待触发器完成 程序和触发器都是 PRAGMA AUTONOMOUS_TRANSACTION 您可以尝试将触发器部分作为dbms\u作业运行。。。详情如下: CREATE OR REPLACE TRIGGER myrigger AFTER INSERT ON mytable REFERENCING NEW AS New OLD AS O

对于一个表,中间有一个插入操作的过程。该表包含一个触发器,因此整个事务将被保留。是否有其他方法可以使触发器在单独的会话上运行,并在插入操作后运行程序,而无需等待触发器完成

程序和触发器都是

PRAGMA AUTONOMOUS_TRANSACTION

您可以尝试将触发器部分作为
dbms\u作业运行
。。。详情如下:

CREATE OR REPLACE TRIGGER myrigger
AFTER INSERT
ON mytable  
REFERENCING NEW AS New OLD AS Old
  FOR EACH ROW
  DECLARE
  l_job number;
  begin 
    dbms_job.submit( l_job, 'MYPACKAGE.MYFUNCTION(''' || :new.myField || ''');' );
  END ;
/

如果触发器基于插入操作,它将保持当前会话,直到触发器操作完成。这是在数据库端维护完整性所必需的。如果已知需求,则可以更好地设计程序和触发器。

为什么整个事务因触发器而被搁置。触发器是应该在其他表上执行某些活动的事件。你是如何识别的,因为你的插入是保持的。你的触发器是做什么的?绕过或延迟触发器是一种选择吗?触发器始终是实际DML(插入、删除、更新等)的一部分,在触发器内进行任何与事务相关的处理通常是一个坏主意。有一个过程有一个将数据插入表的部分。该表有一个触发器,因此在触发器事件完成之前,它将等待,而不继续事务的其余部分。我知道这一点,因为我在数据插入之前和之后将日志保存在表中,也保存在触发器中。它总是在触发器内的日志之后显示“插入后”日志。pragma使触发器独立于事务。但是,两个事务(您的事务和触发器的事务)都可能试图写入相同的记录,从而相互阻碍。理想情况下,这种情况永远不会发生;自治触发器应该只写一些日志条目之类的事情。如果它做的不止这些(即写入业务表),那么这种方法似乎是错误的。那么这会在不同的会话中单独运行并且不会影响主事务吗?@Optimuskck是的,它会作为计划任务单独运行。。。请注意,
dms\u作业
将对它将执行的任务执行隐式的
commit
。@WernfriedDomscheit yes。。。不同的session,但不是线程。如果触发器执行时间为
1分钟
。。。即使是在单独的事务上执行,整个流程是否会阻塞?(我的意思是执行仍然是顺序的,不是吗?)。另一方面,
dbms\u作业
-根本不会阻止进程-因为调度的过程是在不同的线程上执行的…@Optimuskck正如我在上面对WernfriedDomscheit所说的,如果您的问题是触发器的执行时间-那么使用
dbms\u作业
,您可以解决这个问题,因为执行不仅将作为单独的事务执行,还将在单独的线程上执行。我将使用@Plirkee并让您知道。同时,您能否告诉我如何在作业本身中添加多个参数?