2012-04-10 8 views
0

私は機能面では(私のテストで知る限り)このトリガーを持っていますが、IF UPDATEを使用してコードを単純化することができると強く思っています...私は、挿入されたテーブルと削除されたテーブルの観点から、最も優れたうねりのないトリガーをやっているようです。これらの結合は、AFTER INSERT、UPDATEのトリガーになります。 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 

答えて

3

更新された(column_name)は、その列がトリガーを発生させたクエリに参加しているだけであるため、援助できません。 date_createdが保持する日付を決定するのに役立つcaseステートメントを使用すると、トリガーの更新部分を短くすることができます。

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

これはちょうど私が望んでいた助けの種類です、ありがとう! –