2012-02-24 13 views
0

テーブル上でトリガを発生させた行を知りたい。 そのため、変更された行だけをバックアップテーブルにバックアップしたいのです。 たとえば、フィールドがID,NAME,ADDRESS,CITYのテーブルがあり、それらのフィールドの1つが更新、削除、または挿入されている場合は、その行のコピーをバックアップテーブルに作成しますが、変更された行のみテーブル全体。テーブル上のトリガを起動した行を調べる(SQL 2008)

テーブル全体のバックアップを作成するトリガーを作成するのは簡単ですが、変更された行のみをバックアップするソリューションは見つかりません。

答えて

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 
2

CREATE TRIGGER documentationによれば:

DMLはdeletedinserted論理(概念)を使用してトリガ テーブル。これらは、 トリガが定義されているテーブル、つまりユーザアクションが であるテーブルと構造的に似ています。削除され挿入されたテーブルは、ユーザアクションによって変更される可能性のある古い値または新しい 行の値を保持します。

+0

おかげで、同じ溶液に来ました。ここで私は問題を解決するために使用したコード: –

1

SQL Serverは、トリガー内でdeletedinsertedという名前の2つの「仮想」テーブルを通じてテーブルに加えられた変更を公開します。挿入操作の場合、insertedには新しく挿入されたデータが含まれ、削除は空です。削除操作の場合はinsertedが空で、deletedテーブルには削除された行が含まれます。更新操作の場合、insertedテーブルには更新後に変更された行が含まれ、更新前の行にはdeletedが含まれます。

両方のテーブルは基本的なテーブルと構造的に同じです。更新イベントの場合は、関数update() を使用して、特定の列が更新されたかどうかを確認できます。

関連する問題