【问题标题】:Best design for tracking Order changes跟踪订单更改的最佳设计
【发布时间】:2025-12-03 01:20:03
【问题描述】:

需要跟踪订单的后续变化;

  • 谁创建了订单以及何时创建的
  • 谁添加/更新/删除了具有数量和时间的项目

我有这个想法,但不确定它是否有好处,另外不确定命名约定

LogEventType

  • 身份证
  • 类型(即更新、删除、添加)

订单记录

  • 日志ID
  • EventType (FK_LogOperation_ID)
  • 订单编号
  • 项目编号
  • 数量
  • 用户名

【问题讨论】:

  • 你已经有一个Order表了吗?它是什么样的表? type1 还是 type2(保留历史记录)?
  • 是的,有订单抬头和明细表。
  • 你保留历史记录吗?
  • 不,不需要。
  • 您可以使用触发器 (GASP) 并将数据记录到新表中以跟踪该信息。或启用 CDC。或者使用扩展事件

标签: sql-server database logging database-design audit


【解决方案1】:

在不深入更改现有设置和最少工作量的情况下,我会这样做。我欢迎批评。

我假设当有人删除/添加一个项目时,订单标题和详细信息表会立即使用新信息更新(类型 1 - 就地更新)

为此, 我会将 ORDERLOG 更改为 ORDERHISTORY。在其中,我将拥有当前订单及其任何更改。这将是一个追加。新订单将创造新纪录。更新是另一条新记录,等等。

将 ORDER_HEADER 和 ORDER_HISTORY 中的所有字段复制到 ORDERHISTORY。然后添加用于更改检测、当前和更改日期的列。还有更多内容,但现在可以使用。这取决于您,但您可以制作如下列:

CHANGE_TYPE CHAR(1) -- 'A' to add, 'C' to change, 'D' to delete.
IS_CURRENT INT -- 1 is latest record, 0 is not
EFFECTIVE_DATE  DATETIME -- GETEDATE() when record is inserted

当某事发生时,在 ORDERHISTORY 中插入一条记录。遵循上述业务规则,您将能够看到订单从初始到最终的完整历史记录。

您可以在 ORDER_HEADER 表上设置触发器,以便在该表以任何方式受到影响时插入记录。

请注意,这会造成表格蠕变,因此请确保在不再需要时存档或删除。

【讨论】: