2012-04-10 51 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

相關問題