【问题标题】:Running multiple insert and update statements inside oracle trigger在 oracle 触发器中运行多个插入和更新语句
【发布时间】:2021-05-07 14:18:50
【问题描述】:

我有一个 oracle 触发器来将数据插入另一个表。如果我使用单个更新查询而不是它,但是如果我使用多个命令(如更新和插入)它会失败并出现以下错误。

ORA-04091: table ADMIN_SMS_HANDLER is mutating, trigger/function may not see it
ORA-06512: at "ADMIN_SMS_TRIG", line 16
ORA-04088: error during execution of trigger 'ADMIN_SMS_TRIG'

这行得通。

CREATE OR REPLACE TRIGGER ADMIN_SMS_TRIG AFTER
    INSERT ON ADMIN_SMS_HANDLER
    FOR EACH ROW
DECLARE BEGIN
    INSERT INTO SMS (
        SMSID,
        ANUMBER,
        BNUMBER,
        MSG,
        APP
    ) VALUES (
        SMSSEQ.NEXTVAL,
        :NEW.SMS_FROM,
        :NEW.SMS_TO,
        :NEW.SMS_TEXT,
        'APP'
    );
END;

但这不起作用

CREATE OR REPLACE TRIGGER ADMIN_SMS_TRIG AFTER
    INSERT ON ADMIN_SMS_HANDLER
    FOR EACH ROW
DECLARE BEGIN
    INSERT INTO SMS (
        SMSID,
        ANUMBER,
        BNUMBER,
        MSG,
        APP
    ) VALUES (
        SMSSEQ.NEXTVAL,
        :NEW.SMS_FROM,
        :NEW.SMS_TO,
        :NEW.SMS_TEXT,
        'app'
    );

    UPDATE ADMIN_SMS_HANDLER
    SET
        SENT_DATE = SYSDATE,
        SENT_STATUS = 1,
        UPDATED_BY = 'trigger',
        UPDATED_DATE = SYSDATE
    WHERE
        ID = :NEW.ID;
END;

【问题讨论】:

  • 因为您正在尝试更新创建触发器的表。ADMIN_SMS_HANDLER。您是否尝试过插入前触发器?

标签: oracle oracle11g triggers


【解决方案1】:

这个问题与多个语句无关。问题是行级触发器(通常)无法引用定义它的表。

假设意图是让触发器自动填充某些列,您可以通过直接在 :new 伪记录中设置值来做到这一点,即

:new.sent_date := sysdate;
:new.sent_status := 1;

但由于您要修改当前行中的数据,您需要使用before insert 触发器而不是after insert 触发器。类似的东西

CREATE OR REPLACE TRIGGER ADMIN_SMS_TRIG 
    BEFORE INSERT ON ADMIN_SMS_HANDLER
    FOR EACH ROW
DECLARE 
BEGIN
    INSERT INTO SMS (
        SMSID,
        ANUMBER,
        BNUMBER,
        MSG,
        APP
    ) VALUES (
        SMSSEQ.NEXTVAL,
        :NEW.SMS_FROM,
        :NEW.SMS_TO,
        :NEW.SMS_TEXT,
        'app'
    );

    :new.SENT_DATE := SYSDATE;
    :new.SENT_STATUS := 1;
    :new.UPDATED_BY := 'trigger';
    :new.UPDATED_DATE := SYSDATE;
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 2017-06-26
    • 2011-02-27
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多