0

次のようなトリガーがあります。

ALTER TRIGGER [dbo].[trSeasonHotelsSupplierOfferUpdate]
  ON  [dbo].[SeasonHotelsSupplierOffers]
  AFTER UPDATE
AS
BEGIN
  IF ((SELECT COUNT(*) FROM inserted) = 1 AND (SELECT COUNT(*) FROM deleted) = 1)
  BEGIN
       INSERT INTO SeasonHotelsSupplierOffersHistory (SeasonHotelSupplierOfferID, ColumnEN, OldValue, NewValue, UpdateDate, UpdatedByID)
         SELECT 
            i.SeasonHotelSupplierOfferID, 'Name', d.Name, i.Name, i.UpdateDate, i.UpdatedByID 
         FROM 
            inserted i, deleted d       
         WHERE 
            ISNULL(i.Name,'')<>ISNULL(d.Name,'')
    END
END

挿入されたデータと削除されたデータに対してもこれを機能させる必要があります。これはすべて、次の列を持つSeasonHotelsSupplierOffersHistoryというテーブルに保存されます。

SeasonHotelSupplierOfferID、ColumnEN、OldValue、NewValue、UpdateDate、UpdatedByID

更新後、削除、挿入`と言わなければならないことは知っていますが、それだけです。

ありがとう

4

1 に答える 1

1

INSERTとDELETEでトリガーを機能させる方法が唯一の実際の質問であるように思われるため、あなたが何を求めているのか100%わかりませんが、あなたはすでに質問の中でこれに答えています。トリガー内の挿入を挿入と削除で機能させるのに苦労していると思います。私はこのようなものがうまくいくと想像します。

CREATE TRIGGER trSeasonHotelsSupplierOfferUpdate 
ON dbo.SeasonHotelsSupplierOffers
AFTER UPDATE, INSERT, DELETE
AS
BEGIN
    INSERT  SeasonHotelsSupplierOffersHistory (SeasonHotelSupplierOfferID, ColumnEN, OldValue, NewValue, UpdateDate, UpdatedByID)
    SELECT  COALESCE(inserted.SeasonHotelSupplierOfferID, deleted.SeasonHotelSupplierOfferID),
            'Name', 
            deleted.Name, 
            inserted.Name, 
            COALESCE(inserted.UpdateDate, deleted.UpdateDate),
            COALESCE(inserted.UpdatedByID, deleted.UpdatedByID)
    FROM    inserted
            FULL JOIN deleted
                ON inserted.SeasonHotelSupplierOfferID = deleted.SeasonHotelSupplierOfferID
    WHERE   COALESCE(inserted.Name, '') != COALESCE(deleted.Name, '')   -- ONLY INSERT WHERE NAME HAS CHANGED
END

挿入をnullとして識別しOldValue、削除をnullとして識別することができNewValueます。

于 2012-11-29T10:46:39.873 に答える