我找不到一种简单/通用的方式向注册表中注册某些表上已更改的列。更新审计时的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:很好的一点。我写的最近一个触发器使用服务代理(不是用于审计,但它是一个可能的解决方案)。它将异步排队,直到锁被释放。虽然如果你要付出很多努力,为什么不分开表格。他们也会更快地查询。 –