【问题标题】:Derby ERROR 54038: Maximum depth of nested triggers was exceededDerby ERROR 54038:超过嵌套触发器的最大深度
【发布时间】:2016-05-27 13:11:28
【问题描述】:

如果 owner_id 为 null,我正在尝试触发一个触发器,该触发器在更新或插入到 owner_notif_sta 后将 owner_notif_sta 设置为 null。 owner_id 和 owner_notif_sta 都来自同一张表。

触发器:

CREATE TRIGGER check_owner
AFTER UPDATE OF owner_notif_sta ON risk
REFERENCING OLD AS EXISTING
FOR EACH ROW MODE DB2SQL
    UPDATE risk SET owner_notif_sta = NULL
    WHERE owner_id IS NULL;

我尝试触发的更新:

UPDATE RISK SET owner_notif_sta = 'helloo' WHERE risk_id = 'ICT123';

并且 owner_id 为空(我触发更新时未填充)

我收到以下错误: 错误 54038:已超出嵌套触发器的最大深度。

提前致谢

【问题讨论】:

    标签: sql database derby


    【解决方案1】:

    稍微改变UPDATE 语句以排除已经有owner_notif_sta 为空的行怎么样:

    CREATE TRIGGER check_owner
    AFTER UPDATE OF owner_notif_sta ON risk
    REFERENCING OLD AS EXISTING
    FOR EACH ROW MODE DB2SQL
        UPDATE risk 
           SET owner_notif_sta = NULL
         WHERE owner_id IS NULL
           AND owner_notif_sta IS NOT NULL;
    

    【讨论】:

    • 谢谢。我试过了,但我认为 Derby 不支持 If else 语句。
    • 我编辑了我的答案。我认为它更简单,它应该可以工作。只需在触发器中UPDATE 语句的末尾添加AND owner_notif_sta IS NOT NULL。它应该防止递归触发调用。
    • 我应该补充一点,因为这是一个行触发器,我很惊讶您的更新语句在键或 id 列上没有 where 子句(例如:where id = existing.id).我希望更新仅限于一行,但我没有看到。这可能是您需要查看的其他内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2018-04-14
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多