【问题标题】:use triggers to keep history of relational tables使用触发器来保存关系表的历史
【发布时间】:2011-09-29 04:35:29
【问题描述】:

假设我有 6 张桌子。

  1. 工作站
  2. 工作站_CL
  3. 位置
  4. Lo​​cation_CL
  5. 功能
  6. Features_CL

我目前正在使用触发器向每个表的“_CL”版本中插入一个附加字段,该字段表示更改是“UPDATE”、“INSERT”还是“DELETE”。

工作站表跟踪“modified_by”用户。如果用户更新“工作站”对象的位置,则“位置”表以及“工作站”表都会更新。对 Workstation 表的唯一修改是“modified_by”字段,以便我知道是谁进行了更改。

我遇到的问题是当我考虑提取审计报告时。如何将“Location_CL”中的记录链接到“Workstation_CL”中的记录两者都由单独的触发器填充。

不知何故,我的问题部分被删除了。对此感到抱歉。

问题:如何在“Workstation_CL”和“Location_CL”中提取某种类型的唯一标识符,以便识别每个修订版?例如,当我从“Location_CL”中提取所有记录并看到所有位置更改时,从“Workstation_CL”中提取用户名,导致位置发生变化?

【问题讨论】:

  • 问题是:How will I link records in the "Location_CL" to the ones in the "Workstation_CL"
  • 感谢@Dems,这是正确的。

标签: sql triggers audit


【解决方案1】:

给每个版本一个由触发器生成的 GUID。使用值填充两个表中的字段 (RevisionId)。

【讨论】:

  • 我将 GUID 从 Workstation_CL 表推送到 Location_CL 表?两个触发器都从单独的存储过程中相互独立地触发。
【解决方案2】:

每个审计表需要 2,也许 3 列。

1) 时间戳,以便您了解更改的时间。
2) 用户已更改,因此您可以跟踪谁进行了更改 - 我假设 Location 可以独立于 Workstation 更改。 3) 您可能还需要交易的标识符。我认为您可以从数据库中获取 id,但我不确定。

不过,我认为没有时间戳和用户就无法获得有效的报告,而且我认为您不能只将用户放在一张桌子上。

【讨论】:

  • 我正在考虑在 Workstation_CL 表中添加一个自动生成标识符,但我需要找到一种方法将该标识符插入到 Location_CL 表中......
【解决方案3】:

在触发事件期间,我能够执行以下操作:

SELECT @trans_id=transaction_id FROM sys.dm_tran_current_transaction

这给了我当前操作的事务 id。

这样,我可以将其插入到相应的 _CL 表中,然后执行与自动生成 ID 匹配的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2010-10-19
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多