0

私は機能的に機能するこのトリガーを持っています (私のテストでわかる限り) が、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
4

1 に答える 1

3

If updated(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
于 2012-04-10T23:44:53.553 に答える