一部のテーブルで列が変更された監査テーブルに登録する簡単で一般的な方法が見つかりません。すべての監査表の定義の監査の更新時にSQLサーバートリガー
まず:
CREATE TABLE [Audit](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Date] [datetime] NOT NULL default GETDATE(),
[IdTypeAudit] [int] NOT NULL, --2 for Modify
[UserName] [varchar](50) NULL,
[TableName] [varchar](50) NOT NULL,
[ColumnName] [varchar](50) NULL,
[OldData] [varchar](50) NULL,
[NewData] [varchar](50) NULL)
次のいずれかのテーブル内のAFTER UPDATEのトリガー
私はこのようにアップデートした後にトリガを使用して、それを実行しようとしました。
DECLARE
@sql varchar(8000),
@col int,
@colcount int
select @colcount = count(*) from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyTable'
set @col = 1
while(@col < @colcount)
begin
set @sql=
'INSERT INTO Audit
SELECT 2, UserNameLastModif, ''MyTable'', COL_NAME(Object_id(''MyTable''), '+ convert(varchar,@col) +'), Deleted.'
+ COL_NAME(Object_id('MyTable'), @col) + ', Inserted.' + COL_NAME(Object_id('MyTable'), @col) + '
FROM Inserted LEFT JOIN Deleted ON Inserted.[MyTableId] = Deleted.[MyTableId]
WHERE COALESCE(Deleted.' + COL_NAME(Object_id('MyTable'), @col) + ', '''') <> COALESCE(Inserted.' + COL_NAME(Object_id('MyTable'), @col) + ', '''')'
--UserNameLastModif is an optional column on MyTable
exec(@sql)
set @col = @col + 1
end
問題
私はexec関数を使用する場合- 挿入、削除は
- コンテキストを失ったそれは常に相関数ではありませんcolnumberあなたは20列を持つテーブルを作成し、1を削除して、別のものを作成した場合、思われることだが、最後の一つは、私がネットの上にすべてのためのソリューションを探していた番号> @colcount
を持っているが、私は
任意のアイデアを把握couln't?
ありがとうございます!
私はあなたが言った解決策を理解していますが、監査する必要があるテーブルごとに監査テーブルが必要なため、データベース全体で変更を探す複雑さが増しています。多分私はあなたに勧めます。 – Santiago
@Sanitagoでは、各テーブルの監査テーブルが必要です。そうしないとロックの問題が発生します。 – HLGEM
@HLGEM:非常に良い点。私が書いた最近のトリガーは、サービスブローカーを使用します(監査用ではありませんが、それは可能な解決策です)。ロックが解放されるまで非同期にキューに入れられます。あなたが多くの努力をしているのであれば、別々のテーブルを持たないといけません。彼らはまた、より高速にクエリします。 –