更改历史记录跟踪和报告

时间:2013-09-18 04:05:01

标签: sql sql-server-2008

我们不允许使用CDC。

我们要求报告对表格所做的更改,格式为:

  

在[此日期]上,用户[UserName]更改了[FieldName]字段   [OldValue]到[新值]

我的想法是在表上使用Update / Insert触发器,将其称为TableA,并将该行写入新的TableA_Tracking表,该表是相同的列,以及源表的外键。

TableA有一个'LastUpdatedByUserId'以及一个'LastUpdateDate'列。

使用触发器存储数据是可以的。但是,我想知道是否有一种有效的方法来获取数据,以便我可以将其报告给应用程序。

我是否可以使用一种模式将数据提取为表格格式,并将其返回到UI进行格式化?

我在想,有些事情就是:

WITH Track_CTE (
  Placement_TrackID, 
  PlacementId, 
  PlacementEventId, 
  CarerId,
  FosterCareAllowanceFlag,
  InterstateAllowanceAmount,
  FosterCareAllowanceReason,
  FosterCareAllowanceDate,
  InterstateAllowanceFlag,
  LastUpdateUser,
  LastUpdateDate
)
AS
(
  SELECT 
    Placement_TrackID, 
    PlacementId, 
    PlacementEventId, 
    CarerId,
    FosterCareAllowanceFlag,
    InterstateAllowanceAmount,
    FosterCareAllowanceReason,
    FosterCareAllowanceDate,
    InterstateAllowanceFlag,
    LastUpdateUser,
    LastUpdateDate
  FROM       
    [Placement_Track]
)
SELECT    *

FROM   Track_CTE c1
LEFT JOIN Track_CTE c2
ON c2.Placement_TrackID = c1.Placement_TrackID - 1

其中Placement_Track是一个表,它是源表的直接副本,但PK(第一列)除外。该表由更新和插入的触发器写入。

然后有一行更新版本和之前的版本......从那里,可能会计算出更改?但是,我可能会偏离轨道。

在上面的示例中,我将对PlacementId进行过滤,因为这是源表的PK,因此选择将更加有限。此外,在此示例中,我跟踪的唯一列是FosterCareAllowanceFlag,InterstateAllowanceAmount,FosterCareAllowanceReason,FosterCareAllowanceDate和InterstateAllowanceFlag。

1 个答案:

答案 0 :(得分:0)

每当表格行发生变化时,旧数据在系统临时表中的触发器中可用## deleted&表格##中提供了新数据。

因此,如果表X(id int,col1 varchar(5),col2 varchar(100))包含:

id = 1,col1 ='Code',col2 ='Descrition',然后通过以下方式更新此数据:

UPDATE X set col2 = 'Description' WHERE id = 1;

表##已删除包含id = 1,col1 ='Code',col2 ='Descrition' table ## inserted包含id = 1,col1 ='Code',col2 ='Description'

您可以使用INFORMATION_SCHEMA.COLUMNS计算表总数中有多少列(假设表的名称是在触发器内的变量中定义的),并且使用此信息,循环应该没有问题通过表格的列,将## deleted与## inserted进行比较,以生成所需的审计数据。