【问题标题】:How to resolve a loop in my SQL trigger?如何解决我的 SQL 触发器中的循环?
【发布时间】:2016-06-10 09:56:02
【问题描述】:

我必须编写一个触发器,它会在添加消息条目后更新它,如果添加的消息文本是 20 字或更长,则更新。我不断收到 ORA-06512 和 ORA-04088 错误,这显然是当您激活了 INSERT 触发器时,您的触发器正在导致另一个 INSERT,从而形成无限循环。

但我的触发器中有一个更新,它应该只由 INSERT 触发。我似乎找不到代码逻辑中的缺陷。有没有人写这个?

CREATE OR REPLACE TRIGGER Length
    AFTER INSERT ON Messages
    FOR EACH ROW
    WHEN (length(new.msg_text) - length(replace(new.msg_text, ' ', '')) >= 20)
    BEGIN
        UPDATE Messages
        set Messages.length = 1
        WHERE Messages.msgID = :new.msgID;
    END;
/

【问题讨论】:

    标签: sql oracle triggers insert sql-update


    【解决方案1】:

    在插入之前插入:

    CREATE OR REPLACE TRIGGER Length
        BEFORE INSERT ON Messages
        FOR EACH ROW
        WHEN (length(:new.msg_text) - length(replace(:new.msg_text, ' ', '')) >= 20)
        BEGIN
            :new.length := 1
        END;
    

    【讨论】:

    • 创建触发器时出现编译错误,之后触发触发器时出现编译错误 ORA-04098: trigger 'XXXX.LENGTH' is invalid and failed re-validation
    • 是的,有一个同名的表。有其他方法可以尝试吗?
    • 消息是否有名为length 的列?您的问题肯定表明确实如此。 ——戈登·林诺夫
    • 实际上,当我尝试您的建议时,我想我有一个错字。现在可以了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2019-03-30
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    相关资源
    最近更新 更多