【问题标题】:SQL Triggers for Delete and Insert too删除和插入的 SQL 触发器
【发布时间】:2012-11-29 08:00:48
【问题描述】:

我有一个如下所示的触发器:

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、UpdateByID

我知道我必须说 After Updated, Delete, Insert`,但仅此而已。

谢谢

【问题讨论】:

  • 您是否知道您现有的更新触发器会忽略影响多行的更新语句?
  • 我一次只能更新一行,所以没关系
  • 是的 marc_s,投反对票非常成熟......至少为你的投反对票带来论据。我的意思是关于主题论点。并不是说您在我的文字中看到了您不喜欢的字母或字体。

标签: sql sql-server triggers


【解决方案1】:

我不能 100% 确定您要问什么,因为唯一的实际问题似乎是如何让触发器为 INSERT 和 DELETE 工作,但您已经在问题中回答了这个问题。我只能假设您正在努力使触发器中的插入工作用于插入和删除。我会想象这样的事情会起作用。

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

您将能够识别插入,因为OldValue 将为空,而删除NewValue 将为空。

【讨论】:

  • 完美,正是我想要的。完美地插入历史。谢谢!有一个问题的想法,我认为这与它无关。我有一个用于保存记录的存储过程,它返回插入记录的 id,但是现在,由于触发器它返回历史表中最后插入记录的 id...知道为什么会发生这种情况吗?跨度>
  • 我发现了问题:SET @SeasonHotelSupplierOfferID = (Select IDENT_CURRENT('SeasonHotelsSupplierOffers'))....之前是@@Identity,它带来了当前会话上最后一个身份的ID
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 2010-12-17
相关资源
最近更新 更多