0

我们不允许使用 CDC。

我们需要报告对表格所做的更改,格式如下:

在 [This Date],用户 [UserName] 将字段 [FieldName] 从 [OldValue] 更改为 [New Value]

我的想法是在表上使用更新/插入触发器,将其称为 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。

4

1 回答 1

0

每当表行更改时,系统临时表##deleted 中的触发器中的旧数据可用,而表##inserted 中的新数据可用。

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

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

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

table ##deleted 包含 id = 1, col1 = 'Code', col2 = 'Descrition' table ##inserted 包含 id = 1, col1 = 'Code', col2 = 'Description'

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

于 2013-09-18T04:15:01.117 回答