【发布时间】:2011-05-02 00:16:37
【问题描述】:
在以前的应用程序版本中,我们使用特定字段作为主键,但由于该字段可能代表不同系统中的不同身份,我们将其设为非重要字段(即不是主键或复合主键的一部分) 但是,由于我们没有其他系统,但用户仍然使用该字段作为主要的识别方法。
问题在于审计...以前我使用单个表对数据库进行所有审计,使用浮动的通用触发器使用新值旧值模式转储数据。除了一件事,这仍然可以正常工作。我已将联系信息移动到一个单独的表中,该表与原始表的新主键相关联。因此,当进行更改时,审核日志中会显示不熟悉且未使用的主键,而不是现在无关紧要的 foreignSystemID...
我开始采用一对一的复制审核方法,以便对任何表的任何更改现在都写入不同架构中的镜像。问题归结为向用户显示更改。他们习惯于查看仅显示特定医生更改值的报告...
我的问题是使用 sql 查询和 Crystal 报表,我如何才能只显示审计表中行之间的更改列值。我看过枢轴命令,但我认为这对我没有帮助。我还查看了脚本中比较列并确定它们是否不同并将它们写入表的代码。
我真的在沙子里旋转,这是我要解决的关键问题。在此先感谢您的帮助...
我们已经足够早地投入生产,如果需要我可以更改我的变更跟踪方法,但它需要尽快。谢谢
编辑:
我的老板和我已经在这方面做了一些工作,这就是我们的开始......我想获得更多的意见和选择......以及......谢谢......
CREATE TABLE #TEMP (
DoctorsID bigint,
TableName varchar(50),
FieldName varchar(50),
CurrentFieldValue varchar(255),
PreviousFieldValue varchar(255),
PreviousValueDate datetime
)
DECLARE @sql varchar(MAX)
SELECT
@sql = COALESCE(@sql,'') +
CAST(
'INSERT INTO #TEMP ' +
'SELECT ' +
'o.DoctorsID, ' +
'''' + TABLE_NAME + ''' ,' +
'''' + COLUMN_NAME + ''',' +
'o.' + COLUMN_NAME + ',' +
'a.' + COLUMN_NAME + ',' +
'a.AuditDate' +
' FROM ' +
'dbo.DoctorLicenses o ' +
'INNER JOIN Audit.DoctorLicenses a ON ' +
'o.DoctorsID = a.DoctorsID ' +
'WHERE ' +
'AuditDate BETWEEN ''10/01/2010'' AND ''10/31/2010'' AND ' +
'o.' + COLUMN_NAME + ' <> a.' + COLUMN_NAME +
';'
AS varchar(MAX))
FROM
INFORMATION_SCHEMA.COLUMNS AS [Fields]
WHERE
TABLE_SCHEMA = 'dbo' AND
TABLE_NAME = 'DoctorLicenses'
PRINT @sql
EXEC(@sql)
SELECT * FROM #TEMP
DROP TABLE #TEMP
【问题讨论】:
标签: sql crystal-reports pivot audit-tables