2012-04-10 52 views
0

我有这个触发器在功能上工作(据我的测试我可以告诉),但我强烈怀疑我可以通过使用IF UPDATE来简化代码...我只是不完全明白它是如何工作的。就插入和删除表而言,我似乎做了最好的未知触发器。这些连接是否在AFTER INSERT,UPDATE触发器等同的内部。使用IF UPDATE(column ...)?

该触发器是否可以按照我刚才提到的方式进行简化(或以其他方式提高可读性)?

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 

回答

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 
+0

这就是我希望的那种帮助,谢谢! – 2012-04-11 00:30:24

相关问题