【发布时间】: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,它可能会提供一些关于您收到的错误消息的见解。
-
我删除了我的第二个触发器,所以这是我的数据库中唯一的触发器。但错误保持不变