Узнайте, какая строка запустила триггер в таблице (SQL 2008) - PullRequest
0 голосов
/ 24 февраля 2012

Я хотел бы знать, какая строка запустила триггер на столе. Поэтому причина в том, что я хотел бы сделать резервную копию только измененной строки в таблицу резервных копий. Например, у меня есть таблица с полями ID, NAME, ADDRESS, CITY, и когда одно из этих полей будет обновлено, удалено или вставлено, я сделаю копию этой строки в резервную таблицу, но только измененная строка, а не вся таблица.

Создать триггер, который делает резервную копию всей таблицы, легко, но я не могу найти решение для резервного копирования только измененной строки.

Ответы [ 4 ]

2 голосов
/ 24 февраля 2012

Согласно документации CREATE TRIGGER :

Триггеры DML используют логические (концептуальные) таблицы deleted и inserted.По своей структуре они аналогичны таблице, для которой определен триггер, то есть таблице, в которой выполняется пользовательское действие.Удаленные и вставленные таблицы содержат старые значения или новые значения строк, которые могут быть изменены действием пользователя.

2 голосов
/ 24 февраля 2012

Посмотрите на вставленную таблицу в триггере - она ​​показывает вставки и обновления - см. http://msdn.microsoft.com/en-us/library/ms191300.aspx для примера

1 голос
/ 24 февраля 2012

SQL Server предоставляет в триггере изменения, внесенные в таблицу, через две «виртуальные» таблицы с именами deleted и inserted. В случае операции вставки inserted содержит вновь вставленные данные, а удаленные - пустые, в случае операции удаления inserted - пустые, а таблица deleted содержит удаленные строки. В случае операции обновления таблица inserted содержит измененные строки после обновления и deleted строки до обновления.

Обе таблицы структурно идентичны базовой таблице. Вы можете использовать функцию update() в случае события обновления, чтобы проверить, был ли обновлен какой-либо конкретный столбец.

0 голосов
/ 20 марта 2012

Я пришел к тому же решению, поэтому код, который я использовал для выполнения задачи:

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
...