【问题标题】:Getting trigger to insert changed column values only in audit table获取触发器以仅在审计表中插入更改的列值
【发布时间】:2010-10-18 22:02:16
【问题描述】:

我正在使用触发器将更改存储在审计表中,我只想存储已更改列中的值。

BEGIN
IF NEW.history_of_repair_trigger_fired = 1 THEN
INSERT INTO history_of_repair SET
edit_date_time=NEW.last_edited_date_time,
edited_by=NEW.edited_by,
repair_id=NEW.repair_id,
tenant_name=NEW.tenant_name,
property_id=NEW.property_id,
priority=NEW.priority,
comments=NEW.comments,
signed_off=NEW.signed_off;
END IF;
END

目前这也在审计表中存储未更改的值,这是不可取的。

在我的审计表中只存储更改的列的最佳方式是什么?

【问题讨论】:

  • 您能解释一下为什么不希望存储所有值吗?通常,我将审计表视为表中值的历史记录,并希望将当时的所有值连同修改时间和执行者一起保存。
  • 确实有两个原因 - 1) 我不确定始终存储所有内容是否有效?并且 2) 我只打算使用审计来显示更改的值,即当前记录下方的“名字从“bill”更改为“William”11/04/09 15:47 by user: Chris Watts。

标签: mysql triggers audit-tables


【解决方案1】:

根据您的 cmets,我不会担心只存储更改的值——磁盘空间很便宜。存储实际值的好处是,如果您需要赶时间,可以轻松地将记录恢复到某个时间点。如果您需要生成人类可读的审计记录,请将其存储在 varchar/nvarchar 中,并通过将更改累积到字符串中来在触发器中构造消息。除了实际值之外,我可能还会存储它。请注意,您还可以提供一个表值函数,它会为您动态构建这个人类可读的列,而不是存储它。

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2020-11-07
    相关资源
    最近更新 更多