这些连接是否在AFTER INSERT,UPDATE触发器内。使用IF UPDATE(列...)?

时间:2012-04-10 23:03:47

标签: sql tsql sql-server-2008-r2

我有这个功能上的触发器(据我的测试可以告诉我)但我强烈怀疑我可以使用IF UPDATE来简化代码......我只是不完全理解它是如何工作的。我似乎在插入和删除表方面做了最好的未完成触发器。

这个触发器能否按照我刚刚提到的方式(或任何其他提高可读性的方式)进行简化?

CREATE TRIGGER [dbo].[tr_Affiliate_IU] 
   ON  [dbo].[Affiliate] 
   AFTER INSERT, UPDATE
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Get the current date.
    DECLARE @getDate DATETIME = GETDATE()

    -- Set the initial values of date_created and date_modified.
    UPDATE
        dbo.Affiliate
    SET 
         date_created = @getDate
    FROM
        dbo.Affiliate A 
        INNER JOIN INSERTED I ON A.id = I.id
        LEFT OUTER JOIN DELETED D ON I.id = D.id
    WHERE
        D.id IS NULL

    -- Ensure the value of date_created does never changes.
    -- Update the value of date_modified to the current date.
    UPDATE
        dbo.Affiliate
    SET
         date_created = D.date_created
        ,date_modified = @getDate
    FROM 
        dbo.Affiliate A 
        INNER JOIN INSERTED I ON A.id = I.id
        INNER JOIN DELETED D ON I.id = D.id 
END

1 个答案:

答案 0 :(得分:3)

如果更新(column_name)无法帮助,因为它只是声明该列参与了引发触发器的查询。可以通过使用case语句缩短触发器的更新部分,以帮助确定date_created将保留的日期。

CREATE TRIGGER [dbo].[tr_Affiliate_IU] 
   ON  [dbo].[Affiliate] 
   AFTER INSERT, UPDATE
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Get the current date.
    DECLARE @getDate DATETIME = GETDATE()

    -- Set the initial values of date_created and date_modified.
    UPDATE
        dbo.Affiliate
    SET 
      -- If there is a record for this ID in Deleted
         date_created = case when D.id is not null 
                          -- Take date of creation from Deleted
                             then D.date_created 
                             else @getDate 
                             end
        ,date_modified = @getDate
    FROM
        dbo.Affiliate A 
        INNER JOIN INSERTED I ON A.id = I.id
        LEFT OUTER JOIN DELETED D ON I.id = D.id
END