我有一个带有30多个输入控件的asp.net Web表单,我是第一次使用表值参数插入它。
保存后,我需要将功能放在可以更新它们的位置,并且需要创建审计跟踪(从 oldvalue 更改为 newvalue 的内容)。
我正在考虑使用表值参数更新值(这样我将更新所有值,甚至 value1 再次更新为 value1 )ans use {{ 3}}实现审计。*
假设我有10列,我只更改了其中的两列,在SQL中更新时我更新了所有列。 COLUMNS_UPDATED会识别其中只有2个被更改吗?
本地m / c有SQL Server 2008,计划在部署
时将它们放在Azure sql数据库上我正朝着正确的方向前进吗?如果有更好的方法,请告诉我,我会发现更多。
答案 0 :(得分:0)
所以这就是我为实现解决方案所做的工作。
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