如何在sql server update语句中查找列受到影响

时间:2012-01-20 05:23:48

标签: sql sql-server sql-server-2008

我有一个如下表所示的日志表

   [Id]      
  ,[Attribute]
  ,[Action]
  ,[OldValue]
  ,[NEwValue]
  ,[UserId]
  ,[ModifiedDate]

其中id是行ID受影响。 attribute是受影响的列。根据正在执行的操作类型,操作是“插入”或“更新”。 如果更新旧值,则应将更新列的新值插入日志表中的newValue nad旧值列。

Wat是实现这一目标的最佳方式。我应该选择触发器还是存储过程。?

3 个答案:

答案 0 :(得分:2)

您是否检查过SQL Server 2008中引入的“更改数据捕获”? - http://msdn.microsoft.com/en-us/library/bb522489.aspx

答案 1 :(得分:2)

尝试以下示例代码

-- Temp table to track changes
DECLARE  @tmpTable TABLE
(
     [Id]  INT   IDENTITY(1,1)     
    ,[Attribute]   VARCHAR(10)
    ,[Action]   VARCHAR(50)
    ,[OldValue]   VARCHAR(50)
    ,[NEwValue]   VARCHAR(50)
    ,[UserId]   INT 
    ,[ModifiedDate]  DATETIME

)

-- Actual/Transaction table
DECLARE @tblMyTable TABLE
(
        ID INT IDENTITY(1,1),
        Name VARCHAR(50)
)

-- Sample insert query
INSERT      INTO    @tblMyTable
OUTPUT      'Name'
            ,'Inserted'
            ,NULL -- Old value is null
            ,inserted.Name
            ,1 -- user ID
            ,GETDATE()

INTO        @tmpTable 
VALUES      ('New Name');


-- Sample update query
UPDATE      @tblMyTable
SET         Name = 'Updated Name'
OUTPUT      
            'Name'
            ,'Updated'
            ,deleted.Name -- Old value is null
            ,inserted.Name
            ,1 -- user ID
            ,GETDATE()

INTO        @tmpTable


select * from @tblMyTable
select * from @tmpTable

答案 2 :(得分:2)

我找到了解决方案。在这里张贴fa其他人使用

 CREATE TRIGGER [dbo].[tb_sample_UpdationTrigger] on [dbo].[tb_sample]  for UPDATE
    as
     if UPDATE(R_Id) 
     insert into dbo.test_log(Attribute,Action,OldValue,NEwValue,UserId,ModifiedDate)
    (SELECT 'R_Id','update', d.R_Id, i.R_Id ,1,GETDATE()
    FROM inserted i
    INNER JOIN deleted d ON d.id=i.id
    INNER JOIN tb_sample ON tb_sample.id=i.id)