2012-01-20 25 views
0

影響我有一個日誌表列如下圖所示如何找到列得到的SQL Server更新語句

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

其中ID是行ID越來越影響。屬性是受影響的列。根據正執行的操作類型,操作是「插入」或「更新」 如果更新舊值和正在更新的列的新值應插入到日誌表中的newValue和舊值列中

笏可能是最好的方式來實現這一點,我應該去觸發器或存儲過程

+0

當然觸發器。 – adatapost

+0

觸發器對我來說是新的。你可以發佈更新觸發器。所以我可以參考 –

+0

轉到存儲過程並使用輸出子句。 –

回答

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

我找到了解決方案。這裏張貼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)