更新时审计跟踪的更新触发方法>使用表值参数

时间:2017-05-09 08:23:15

标签: asp.net sql-server

我有一个带有30多个输入控件的asp.net Web表单,我是第一次使用表值参数插入它。

保存后,我需要将功能放在可以更新它们的位置,并且需要创建审计跟踪(从 oldvalue 更改为 newvalue 的内容)。

我正在考虑使用表值参数更新值(这样我将更新所有值,甚至 value1 再次更新为 value1 )ans use {{ 3}}实现审计。*

假设我有10列,我只更改了其中的两列,在SQL中更新时我更新了所有列。 COLUMNS_UPDATED会识别其中只有2个被更改吗?

本地m / c有SQL Server 2008,计划在部署

时将它们放在Azure sql数据库上

我正朝着正确的方向前进吗?如果有更好的方法,请告诉我,我会发现更多。

1 个答案:

答案 0 :(得分:0)

所以这就是我为实现解决方案所做的工作。

现在我的历史记录表将如下所示。 enter image description here

ALTER TRIGGER dbo.trProjectDetails ON dbo.tbl_proj_details FOR UPDATE
AS
DECLARE @bit int ,@field int ,  @char int, @fieldName varchar(200)
DECLARE @id int
DECLARE @sqlText nvarchar(1000); 
DECLARE @temp varchar(100)

    Select * into #inserted from inserted
    Select * into #deleted from deleted
    SELECT @field = 0
    WHILE @field < (select max(colid) from syscolumns where id = (select id from sysobjects where name = 'tbl_proj_details'))
    BEGIN
        select @field = @field + 1
        select @bit = (@field - 1 )% 8 + 1
        select @bit = power(2,@bit - 1)
        select @char = ((@field - 1) / 8) + 1
        --select @char, @field, @bit ,substring(COLUMNS_UPDATED(),@char, 1), substring(COLUMNS_UPDATED(),@char, 1) & @bit  
            -- debug code to check the bits that are tested.
        IF substring(COLUMNS_UPDATED(),@char, 1) & @bit > 0
        BEGIN
            select --@field as col#, 
            @fieldName = name from syscolumns 
            where colid = @field 
            and id = (select id from sysobjects where name = 'tbl_proj_details')

            SET @sqlText = N'Insert into [dbo].tbl_proj_action_history 
                            select ins.proj_id, getdate(), SYSTEM_USER , ''' + @fieldName + ''', del.'+ @fieldName +', ins.' + @fieldName + ' 
                            from #inserted ins , #deleted del 
                            where ins.proj_id = del.proj_id';

            exec (@sqlText)  
        END
    END
    DROP table #inserted
    DROP table #deleted
GO