我找不到一種簡單/通用的方式向註冊表中註冊某些表上已更改的列。更新審計時的SQL-Server觸發器
我想用這種方式更新之後做使用上的觸發:
首先審覈表定義的:
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列,你刪除一個並創建另一箇中,最後一個擁有數> @colcount
我一直在尋找過網所有的解決方案,但我couln't弄清楚
任何想法?
謝謝!
我瞭解您所說的解決方案,但這意味着我需要爲每個要審覈的表創建一個審覈表,因此您需要在數據庫中搜索更改的額外複雜性。感謝您的幫助!也許我會做你建議的。 – Santiago
@Sanitago,你確實需要每個表的審計表,否則你將會遇到鎖定問題。 – HLGEM
@HLGEM:很好的一點。我寫的最近一個觸發器使用服務代理(不是用於審計,但它是一個可能的解決方案)。它將異步排隊,直到鎖被釋放。雖然如果你要付出很多努力,爲什麼不分開表格。他們也會更快地查詢。 –