【问题标题】:trigger on after update does take account of all updated values更新后触发确实考虑了所有更新的值
【发布时间】:2018-02-03 05:02:55
【问题描述】:

编辑:这篇文章已解决。我犯了一个愚蠢的错误。我的更新查询没有更改更改字段的值,触发器仅捕获第一个值更改。对不起!

我有一个触发器,它没有考虑更新查询中的所有更新字段。

这是我的触发器history_transaction,我只审核status 和price_asked 表transac_transaction 的字段的更改

CREATE TRIGGER history_transaction
AFTER UPDATE ON transac_transaction
FOR EACH ROW
  BEGIN
    IF(OLD.status <> NEW.status) THEN
      INSERT INTO transac_transaction_history(transac_id, author,     old_data, new_data, date_upd)
  VALUES (OLD.id, OLD.last_author_id_update, OLD.status, NEW.status, NOW());
    END IF;

    IF(OLD.price_asked <> NEW.price_asked) THEN
      INSERT INTO transac_transaction_history(transac_id, author, old_data, new_data, date_upd)
  VALUES (OLD.id, OLD.last_author_id_update, OLD.price_asked, NEW.price_asked, NOW());
      END IF;
  END;
$$

如果我执行更新,例如:

update transac_transaction set price_asked=12.00, status=1 where id=2;

我只会在审计表中插入 price_asked 更改,而不是状态。

我的触发器中缺少某些可能会在字段上循环的内容? 我认为每一行都没有考虑到所有更新的字段。

非常感谢。

【问题讨论】:

    标签: mysql triggers


    【解决方案1】:

    我认为你应该考虑 NULL 值: 可以试试修改吗

    IF(OLD.status <> NEW.status)
    

    与

     IF(OLD.status <> NEW.status 
        OR ((OLD.status IS NULL OR NEW.status IS NULL) AND OLD.status IS NOT NULL A NEW.status IS NOT NULL) )
    

    price_asked 也是如此

    【讨论】:

    • 我刚刚意识到触发器在其他 mariaDB 实例和 Mysql 上运行良好。可能是版本问题...我正在调查...谢谢您的解决方案
    • 我有 mariadb 10.2.3。在 preprod 服务器上,我们有 10.0.29
    【解决方案2】:

    都是我的错。我的更新查询为第二个字段保持相同的值...... 一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-06
      • 2016-03-10
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      相关资源
      最近更新 更多