如何在sql server update语句中查找受影响的列
我有一个日志表列,如下所示如何在sql server update语句中查找受影响的列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个日志表列,如下所示 [Id] ,[Attribute] ,[Action] ,[OldValue] ,[NEwValue] ,[UserId] ,[ModifiedDate] 其中id表示行id受到影响。属性是受影响的列。操作为“插入”或“更新”,具体取决于执行的操作类型。 在更新旧值的情况下,应将更新列的新值和旧值插入日志表中的新值和旧值列 Wat是实现这一点的最佳方法。我应该选择触发器还是存储过程?是否检查了SQL Server 2008中
[Id]
,[Attribute]
,[Action]
,[OldValue]
,[NEwValue]
,[UserId]
,[ModifiedDate]
其中id表示行id受到影响。属性是受影响的列。操作为“插入”或“更新”,具体取决于执行的操作类型。
在更新旧值的情况下,应将更新列的新值和旧值插入日志表中的新值和旧值列
Wat是实现这一点的最佳方法。我应该选择触发器还是存储过程?是否检查了SQL Server 2008中引入的“更改数据捕获”?是否检查了SQL Server 2008中引入的“更改数据捕获”?请尝试以下示例代码
-- 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
请尝试以下示例代码
-- 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
我找到了解决方法。在这里发布其他人使用的
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)
我找到了解决方法。在这里发布其他人使用的
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)
触发器对我来说是新的。你可以为此发布更新触发器吗?这样我就可以引用toGo来获取存储过程和使用输出子句。触发器对我来说是新的。你可以为此发布更新触发器吗?这样我就可以引用toGo来获取存储过程和使用输出子句。