Mysql 用于维护审核日志的触发器之前或之后

Mysql 用于维护审核日志的触发器之前或之后,mysql,triggers,Mysql,Triggers,我一直在网上阅读MySql 5.0的评论流 我想问问社区,这些建议是否好&它们是否仍然适用于5.1。我注意到,今天使用触发器是不可能使用AFTER update更新旧表中的字段的 在触发之前要小心。约束可能会发生,特别是当您使用InnoDB引擎时,插入将失败,但来自BEFORE触发器的操作将成功 使用BEFORE触发器主要用于约束或规则,而不是事务,调整新的。*列应该可以 对于大多数其他操作,如插入历史表或更新非规范化,请坚持使用AFTER触发器 对。顺便说一句,MySQL 5.1没有对触发器工

我一直在网上阅读MySql 5.0的评论流 我想问问社区,这些建议是否好&它们是否仍然适用于5.1。我注意到,今天使用触发器是不可能使用AFTER update更新旧表中的字段的

  • 在触发之前要小心。约束可能会发生,特别是当您使用InnoDB引擎时,插入将失败,但来自BEFORE触发器的操作将成功
  • 使用BEFORE触发器主要用于约束或规则,而不是事务,调整新的。*列应该可以
  • 对于大多数其他操作,如插入历史表或更新非规范化,请坚持使用AFTER触发器

  • 对。顺便说一句,MySQL 5.1没有对触发器工作方式的语义进行任何更改。MySQL试图为触发器语义支持ANSI/ISO SQL规范

    您可以想象,当一行写入数据库时,会运行一系列操作:

  • 在触发器之前运行
  • 评估约束,强制执行
    非空
    ,应用
    默认值
  • 将行写入数据库
  • 更新索引
  • 跟踪触发器
  • 一旦到达AFTER触发器,更改行中的值就太晚了。在某些数据库中,您可以设置
    NEW.somecolumn=1234
    ,但当AFTER触发器完成时,此更改将被自动放弃。在其他数据库中,它通过在定义触发器或运行触发器时给您一个错误来帮助您理解错误

    AFTER触发器最好用于在插入/更新行时执行的额外操作,例如您提到的审计日志记录。首先,MySQL只允许每个表的每个操作有一个触发器,因此如果您还使用BEFORE触发器来更改值和强制执行业务规则,那么现在您至少可以将额外的操作保留在一个单独的触发器中。这使得更新其中一个更容易

    另一个需要考虑的问题是,只有在知道行已成功保存后,才可能执行额外的操作。例如,在BEFORE触发器中记录更改,然后由于NOT NULL约束而中止更改是不对的


    对于需要删除其他表中的依赖行的删除操作,您可能仍然需要在BEFORE触发器中执行该操作。

    谢谢您的详细回答。我决定手动更新dateChanged列,而不是依赖触发器。