"表正在变异"插入具有后插入触发器的表时发生错误

时间:2016-03-04 05:08:31

标签: sql plsql oracle11g database-trigger

我试图创建一个插入后触发器,将购买的详细信息插入购买日志表中,同时更新购买表中的总成本列,将16.5%的GCT添加到总。这两个表有以下列:

    CREATE TABLE purchases 
    (
        p_Id        INTEGER     PRIMARY KEY,
        product     VARCHAR(25) ,
        quantity    INTEGER     ,
        unit_Cost   FLOAT       ,
        total_Cost  FLOAT       
    );

    CREATE TABLE purchases_log
    (
        event_Date      DATE        ,
        p_Id            INTEGER         PRIMARY KEY,
        description     varchar(75) 
    );

我尝试使用的触发器是:

CREATE OR REPLACE TRIGGER PURCHASES_AUDIT
AFTER INSERT ON purchases
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE TAX FLOAT;

BEGIN
INSERT INTO purchases_log
VALUES(SYSDATE,:NEW.p_Id,'INSERT INTO PURCHASES TABLE');
tax := 1.165;
UPDATE purchases SET total_Cost = quantity * unit_Cost;
UPDATE purchases SET total_Cost = total_Cost*tax;
END PURCHASES_AUDIT;
/

但是当尝试在购买表上运行插入时,oracle会给我这个错误

ERROR at line 1:
ORA-04091: table PURCHASES is mutating, trigger/function may
not see it
ORA-06512: at "PURCHASES_AUDIT", line 9
ORA-04088: error during execution of trigger 'PURCHASES_AUDIT'

请帮助

2 个答案:

答案 0 :(得分:2)

不要update定义触发器的表格。

听起来你想要一个修改:new伪记录的插入前触发器而不是插入后触发器。如果我理解你的意图

CREATE OR REPLACE TRIGGER PURCHASES_AUDIT
  BEFORE INSERT ON purchases
  FOR EACH ROW
DECLARE 
  TAX FLOAT;
BEGIN
  INSERT INTO purchases_log
    VALUES(SYSDATE,:NEW.p_Id,'INSERT INTO PURCHASES TABLE');
  tax := 1.165;
  :new.total_Cost = :new.quantity * :new.unit_Cost * tax;
END PURCHASES_AUDIT;

顺便说一句,你真的,真的想要使用float而不是number吗?你是否完全理解浮点数的近似性质?我从来没有遇到任何想要使用float的人。

答案 1 :(得分:0)

作为澄清点:在触发器允许您更新:新值之前,触发器之后不允许。 :如果触发后的新值将始终包含最终值。