找出哪个行触发了表(SQL 2008)

时间:2012-02-24 08:06:33

标签: sql sql-server-2008 triggers backup row

我想知道哪一行在表上触发了触发器。 因此,我想将仅更改的行备份到备份表。 例如,我有一个包含字段IDNAMEADDRESSCITY的表格,当其中一个字段已更新,删除或插入时,我会复制一份那行到备份表,但只有那个更改的行,而不是整个表。

创建一个可以备份整个表的触发器很简单,但我找不到只备份已更改行的解决方案。

4 个答案:

答案 0 :(得分:2)

查看触发器中的插入表 - 它显示插入和更新 - 请参阅http://msdn.microsoft.com/en-us/library/ms191300.aspx以获取示例

答案 1 :(得分:2)

根据CREATE TRIGGER documentation

  

DML触发器使用deletedinserted逻辑(概念)   表。它们在结构上类似于表格   定义了触发器,即用户操作所在的表   试过。已删除和已插入的表包含旧值或新值   用户操作可能更改的行的值。

答案 2 :(得分:1)

SQL Server在触发器中公开通过名为deletedinserted的两个“虚拟”表对表所做的更改。如果插入操作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