【问题标题】:Trigger doesn't work(ORA-04088 error during execution of trigger)触发器不起作用(触发器执行期间出现 ORA-04088 错误)
【发布时间】:2014-03-22 19:31:28
【问题描述】:

我有卖火车票的数据库。我有桌子Ticket 和桌子Cancel(这里是取消的票)。我已经写了一个触发器,如果​​我向表Cancel 添加一些票证,那么这张票证会在表格票证(Client_id 属性 = NULL)中释放。

但我想写一个新的:“如果我取消了票(表Ticket中的Client_id = NULL),然后当我更新票并设置Client_id = 'some_number'(例如Client_id = 5)时,我应该删除这张票来自Cancel 表。 这是我的触发器:

CREATE OR REPLACE TRIGGER Buy_Cancel
  AFTER UPDATE
  ON TICKET
  FOR EACH ROW
  WHEN(old.CLIENT_ID IS NULL)
DECLARE 
  rowAmmount INTEGER;
BEGIN 
  SELECT COUNT(*)
    INTO rowAmmount
    FROM CANCEL c JOIN TICKET t ON c.TICKET_ID = t.TICKET_ID
    WHERE t.TICKET_ID = :OLD.TICKET_ID;
  IF rowAmmount > 0 THEN 
    DELETE FROM CANCEL c
      WHERE c.TICKET_ID = :NEW.TICKET_ID;
  END IF;
END;

当我运行查询时:

UPDATE TICKET t
  SET t.CLIENT_ID = 5
  WHERE t.TICKET_ID = 2;

它会导致这样的错误:

ORA-04091: table MYDB.TICKET is mutating, trigger/function may not see it
ORA-06512: at "MYDB.BUY_CANCEL", line 4
ORA-04088: error during execution of trigger 'MYDB.BUY_CANCEL' SQL6.sql 2 8 

【问题讨论】:

  • 不是没有,但是“CANCEL”对于数据库表来说不是一个好名字。在任何情况下,请参阅this question,它可能会提供一些关于您收到的错误消息的见解。
  • 我删除了我的第二个触发器,所以这是我的数据库中唯一的触发器。但错误保持不变

标签: sql oracle


【解决方案1】:

不确定我是否完全理解您的逻辑,但错误是因为您在该表的触发器中查询 ticket 表。您不需要 - 加入似乎没有添加任何内容,因为您已经有了票证 ID:

CREATE OR REPLACE TRIGGER Buy_Cancel
  AFTER UPDATE
  ON TICKET
  FOR EACH ROW
  WHEN(old.CLIENT_ID IS NULL)
DECLARE 
  rowAmmount INTEGER;
BEGIN 
  SELECT COUNT(*)
    INTO rowAmmount
    FROM CANCEL c
    WHERE c.TICKET_ID = :OLD.TICKET_ID;
  IF rowAmmount > 0 THEN 
    DELETE FROM CANCEL c
      WHERE c.TICKET_ID = :NEW.TICKET_ID;
  END IF;
END;

尽管如此,查询并没有多大意义,真的;只需自行 dpong 删除即可。会工作 - 如果没有匹配的行,它不会出错,所以它会大大简化它。你在select中使用:old,在删除中使用:new;如果它们相同,那很好(如果这是主键,那很可能),但无论如何看起来很奇怪。

【讨论】:

  • 是的,这行得通。我只是不知道我不能在该表的触发器中查询 Ticket 表。据我了解,我无法查询该表,因为我更改了该表中的数据?我承认使用 :OLD 和 :NEW 很奇怪,但在我的情况下没有区别,因为我只更改了 Client_id,而不是 Ticket_id。只是忘了写触发器更新 OF CLIENT_ID;
猜你喜欢
  • 2017-03-26
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
相关资源
最近更新 更多