以前のアプリケーションバージョンでは、主キーに特定のフィールドを使用していましたが、フィールドはさまざまなシステム間で異なるIDを表す可能性があるため、重要ではないフィールド(つまり、主キーまたは複合主キーの一部ではない)にしました。別のシステムはありませんが、ユーザーは引き続きそのフィールドを主要な識別方法として使用します。
問題は監査にあります...以前は、単一のテーブルを使用してデータベースのすべての監査を実行し、浮動している汎用トリガーを使用してnewvalueoldvalueスキーマでデータをダンプしていました。これは、1つのことを除いて、引き続き正常に機能する可能性があります。連絡先情報を、元のテーブルの新しい主キーに関連付けられている別のテーブルに移動しました。したがって、変更が加えられると、今では重要ではないforeignSystemIDの代わりに、見慣れない未使用の主キーが監査ログに表示されます...
1対1の監査方法に移行し、テーブルへの変更が別のスキーマのミラーイメージに書き込まれるようにしました。問題は、ユーザーに変更を表示することです。彼らは、特定の医師の変更された値のみを示すレポートを見るのに慣れています...
私の質問は、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