我们不允许使用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。
答案 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进行比较,以生成所需的审计数据。