如何在mysql表中存储记录更改

时间:2015-11-19 05:16:28

标签: mysql sql triggers

我有两个存储产品定价的表格 -

`product`
- id
- name
- added_date
- is_removed (BOOL)

`price`
- id
- product_id
- price
- price_type
- added_date
- is_removed (BOOL)

这些表格始终反映产品在商店上的当前状态。

但是,出于审计目的,我需要跟踪以下五个事件:

  • 添加了新产品(new product_id,或is_removed 1 ==> 0)
  • 删除产品(is_removed = 1)
  • 添加新价格(new price_id或is_removed 1 ==> 0)
  • 价格被移除(is_removed = 1)
  • 价格改变(价格+ - )

跟踪此事的最佳方法是什么?在应用程序级别执行此操作非常困难,因为这两个表有大约30种方式可以更改。我正在考虑使用像触发器这样的人来将日志添加到另一个表中,尽管我担心这些表格会非常活跃(每天大约10M写入)。

最佳解决方案是什么?请注意,这些表是InnoDB。

1 个答案:

答案 0 :(得分:1)

您可以创建2个表格。一个用于保存delta(已更改)记录,另一个用于保存Core表中前一天的快照。在给定的示例中,我仅使用Product表,但您也可以扩展Price的示例。

  1. (一次性过程)创建另一个表格S并从中同步数据 产品(P)。
  2. 从第二天起,比较PS并找到 更改/新记录。您可以通过左外连接来完成。

    select p.id,p.name,p.added_date,p.is_removed,
    case when S.id is null then 'Insert' 
    else when S.name <> P.name or S.added_date <> P.added_date or S.is_removed <> P.is_removed
    then 'Update'
    else 'No Change' end as RecordStatus
    from Product P
    left outer join S
    on P.id=S.id
    
  3. 现在您可以使用此结果在另一个表中输入记录,例如Audit。您可以使用代理键和日期列来每天在审计中跟踪这些记录

  4. 最后与S同步P。 (从第二天起重复步骤2)