Oracle:在事务中触发(2个语句)

Ash*_*gan 2 oracle triggers transactions oracle10g

我正在研究Oracle 10g数据库,我在事务中遇到了触发器问题. Table A有3个触发器:一个在插入之前,一个在更新之前,最后一个在删除之前 每当触发器触发时,它都会写入一行table B,就像某种日志一样.所有触发器都配置为"before xxx""on each row".使用单个查询,我可以看到它们正在工作.

但是当我在一次事务中执行两次查询修改同一行时(通常,我修改一行然后我删除它,所以a update和a delete),只update运行第一个trigger().在交易结束时,我可以看到我的线路table A已被删除,但只有一行table B显示更新操作,但不显示删除操作.

我可能错误配置了一些东西.它来自触发器配置吗?

Vin*_*rat 6

第二次触发器没有理由不发射,还有其他事情发生.

这是一个小测试用例,显示当单个事务多次修改单个行时所有触发器都会正确触发:

SQL> CREATE TABLE a (ID NUMBER);

Table created

SQL> CREATE TABLE b (action VARCHAR2(3), id_old NUMBER, id_new NUMBER);

Table created

SQL> CREATE TRIGGER trg_a_ins BEFORE INSERT ON a FOR EACH ROW
  2  BEGIN
  3     INSERT INTO b VALUES ('ins', :old.id, :new.id);
  4  END;
  5  /

Trigger created

SQL> CREATE TRIGGER trg_a_upd BEFORE UPDATE ON a FOR EACH ROW
  2  BEGIN
  3     INSERT INTO b VALUES ('upd', :old.id, :new.id);
  4  END;
  5  /

Trigger created

SQL> CREATE TRIGGER trg_a_del BEFORE DELETE ON a FOR EACH ROW
  2  BEGIN
  3     INSERT INTO b VALUES ('del', :old.id, :new.id);
  4  END;
  5  /

Trigger created

SQL> INSERT INTO a VALUES (1);

1 row inserted

SQL> UPDATE a SET ID = 2 WHERE ID = 1;

1 row updated

SQL> DELETE FROM a WHERE ID = 2;

1 row deleted

SQL> select * from b;

ACTION     ID_OLD     ID_NEW
------ ---------- ----------
ins                        1
upd             1          2
del             2 
Run Code Online (Sandbox Code Playgroud)