BEFORE或AFTER触发器用于维护审核日志

时间:2009-01-02 10:30:47

标签: mysql triggers

我一直在create trigger page上阅读MySql 5.0评论流  我想问一下社区是否建议是好的&他们是否仍然适用于5.1。我今天注意到使用触发器的原因是使用AFTER UPDATE更新旧表中的字段是不可能的。

  1. 小心BEFORE触发器。可能会出现约束,特别是如果您使用InnoDB引擎,其中插入将失败,但BEFORE触发器中的操作将成功。
  2. 使用BEFORE触发器主要用于约束或规则,而不是事务,调整NEW。*列应该没问题。
  3. 坚持使用AFTER触发器进行大多数其他操作,例如插入历史记录表或更新非规范化。

1 个答案:

答案 0 :(得分:13)

是。 AFAIK,MySQL 5.1没有对触发器工作方式的语义做任何改变。 MySQL试图支持触发语义的ANSI / ISO SQL规范。

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

  1. 运行BEFORE触发器
  2. 评估约束,强制执行NOT NULL,应用DEFAULT
  3. 将行写入数据库
  4. 更新索引
  5. 运行AFTER触发器
  6. 一旦你到达AFTER触发器,改变行中的值就太晚了。在某些数据库中,您可以设置NEW.somecolumn = 1234,但在AFTER触发器完成时会以静默方式丢弃此更改。在其他数据库中,它可以通过在定义触发器或运行触发器时给出错误来帮助您理解错误。

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

    另一个考虑因素是你应该只在之后执行额外的操作你知道该行已成功保存。例如。在BEFORE触发器中记录更改是不正确的,然后由于NOT NULL约束而使更改中止。

    对于需要在其他表中删除相关行的DELETE操作,您可能仍需要在BEFORE触发器中执行此操作。