SQL:审计更改为具有多个表的对象

时间:2012-03-10 03:01:33

标签: sql sql-server

我有一个Checks表和一个具有一对多关系的Purchase Orders表。 (每个支票有n个采购订单,每个采购订单有1个或0个支票) 用户通常会将检查添加到采购订单,然后修改检查详细信息。有时他们稍后会从PO中删除支票并添加另一个。

我想跟踪检查和采购订单的所有更改,并根据需要显示审计跟踪。典型的审计跟踪如下所示:

  • PO详细信息由(userName)更改为(日期)。将field1从x更改为y,field2 ...等
  • PO详细信息由(userName)更改为(日期)。将field1从x更改为y,field2 ...等
  • 将检查xxxx添加到PO(用户名,日期等)
  • 更改了检查xxxx详细信息等
  • 已删除支票xxxx
  • 将检查yyyy添加到PO
  • 更改了检查yyyy详细信息......

我正在尝试找出如何以规范化方式跟踪表格的更改。当用户更改支票的详细信息时,带有该检查的所有 PO的审计跟踪将显示更改。但审计跟踪应仅显示支票的更改,而支票已附加到相关采购订单。

考虑一种方法,我有ChequeAudit和POAudit表,并在每次基表中的某些内容发生更改时在这些表中存储一行。现在,为了向用户显示采购订单的更改列表,我可以返回有关采购订单本身的所有行,此外还有与采购订单上的任何检查相关的所有行。但是,我需要排除有关在检查添加到采购订单之前进行的支票更改的行,或者从支票单中删除支票后的行。并且日期间隔的直接加入将不起作用,因为可以多次附加和删除支票。

我还没有找到一种方法来在支票更改日志中存储单个条目,并轻松将其链接回采购订单。具体来说,我需要什么数据库结构来查询采购订单,并返回对检查附加到采购订单时发生时发生的任何检查所做的所有更改?这是否可以正常化,或者我是否被迫针对每个关联的PO记录单个更改到支票的详细信息?

1 个答案:

答案 0 :(得分:2)

我将为PO定义一个审计表,为Checks定义另一个审计表。记录选项包括:

  1. OUTPUT子句添加到INSERT / UPDATE / DELETE语句中, 正如我所展示的here
  2. DML触发器是日志更新审计表的另一种常见方式。虽然我举了一个触发器here的示例,但可以在MSDN上找到更深入的讨论。
  3. 作为脚注,我想补充一点,您希望使用存储过程来管理所有DML杂务。