我有一个如下表所示的日志表
[Id]
,[Attribute]
,[Action]
,[OldValue]
,[NEwValue]
,[UserId]
,[ModifiedDate]
其中id是行ID受影响。 attribute是受影响的列。根据正在执行的操作类型,操作是“插入”或“更新”。 如果更新旧值,则应将更新列的新值插入日志表中的newValue nad旧值列。
Wat是实现这一目标的最佳方式。我应该选择触发器还是存储过程。?
答案 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)