我想知道哪一行在表上触发了触发器。
因此,我想将仅更改的行备份到备份表。
例如,我有一个包含字段ID
,NAME
,ADDRESS
,CITY
的表格,当其中一个字段已更新,删除或插入时,我会复制一份那行到备份表,但只有那个更改的行,而不是整个表。
创建一个可以备份整个表的触发器很简单,但我找不到只备份已更改行的解决方案。
答案 0 :(得分:2)
查看触发器中的插入表 - 它显示插入和更新 - 请参阅http://msdn.microsoft.com/en-us/library/ms191300.aspx以获取示例
答案 1 :(得分:2)
根据CREATE TRIGGER
documentation:
DML触发器使用
deleted
和inserted
逻辑(概念) 表。它们在结构上类似于表格 定义了触发器,即用户操作所在的表 试过。已删除和已插入的表包含旧值或新值 用户操作可能更改的行的值。
答案 2 :(得分:1)
SQL Server在触发器中公开通过名为deleted
和inserted
的两个“虚拟”表对表所做的更改。如果插入操作inserted
包含新插入的数据且已删除为空,则在删除操作inserted
为空且deleted
表包含已删除的行时。在更新操作的情况下,inserted
表包含更新后更改的行和deleted
更新前的行。
两个表在结构上与基表相同。您可以使用函数update()
如果是更新事件,请检查某个特定列是否已更新。
答案 3 :(得分:0)
我找到了同样的解决方案,特此是我用来完成任务的代码:
USE [MyTable]
GO
/**** Object: Trigger [dbo].[trg_MappingHistory] Script Date: 03/20/2012 09:08:34 ****/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[trg_MappingHistory] ON [dbo].[Mappings]
AFTER INSERT, DELETE, UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON ;
DECLARE @HistoriekNrNew INT ;
SELECT @HistoriekNrNew = MAX([dbo].[MappingsHistoriek].[HistoriekNr]) + 1
FROM [dbo].[MappingsHistoriek]
IF @HistoriekNrNew IS NULL
BEGIN
SET @HistoriekNrNew = 1
END
-- Insert statements for trigger here
INSERT INTO MappingsHistoriek
( [dbo].[MappingsHistoriek].[EntiteitNaam] ,
[dbo].[MappingsHistoriek].[AppID] ,
[dbo].[MappingsHistoriek].[LijstID] ,
[dbo].[MappingsHistoriek].[Versie] ,
[dbo].[MappingsHistoriek].[LijstNaam] ,
[dbo].[MappingsHistoriek].[Waarde] ,
[dbo].[MappingsHistoriek].[Type] ,
[dbo].[MappingsHistoriek].[Datum] ,
[dbo].[MappingsHistoriek].[Gebruiker] ,
[dbo].[MappingsHistoriek].[HistoriekNr],
[dbo].[MappingsHistoriek].[Actie]
)
SELECT [dbo].[Entiteit].[Naam] ,
deleted.[AppID] ,
deleted.[LijstID] ,
deleted.[LijstNaam] ,
deleted.[Versie] ,
deleted.[Waarde] ,
deleted.[Type] ,
GETDATE() ,
SYSTEM_USER ,
@HistoriekNrNew ,
'DELETED'
FROM deleted
INNER JOIN [dbo].[Entiteit] ON Entiteit.ID = deleted.AppID
INSERT INTO MappingsHistoriek
( [dbo].[MappingsHistoriek].[EntiteitNaam] ,
[dbo].[MappingsHistoriek].[AppID] ,
[dbo].[MappingsHistoriek].[LijstID] ,
[dbo].[MappingsHistoriek].[Versie] ,
[dbo].[MappingsHistoriek].[LijstNaam] ,
[dbo].[MappingsHistoriek].[Waarde] ,
[dbo].[MappingsHistoriek].[Type] ,
[dbo].[MappingsHistoriek].[Datum] ,
[dbo].[MappingsHistoriek].[Gebruiker] ,
[dbo].[MappingsHistoriek].[HistoriekNr],
[dbo].[MappingsHistoriek].[Actie]
)
SELECT [dbo].[Entiteit].[Naam] ,
inserted.[AppID] ,
inserted.[LijstID] ,
inserted.[LijstNaam] ,
inserted.[Versie] ,
inserted.[Waarde] ,
inserted.[Type] ,
GETDATE() ,
SYSTEM_USER ,
@HistoriekNrNew ,
'INSERTED'
FROM inserted
INNER JOIN [dbo].[Entiteit] ON Entiteit.ID = inserted.AppID
END
GO