0

私は開発中のトリガーを持っており、基本的にステートメントの意味で更新を処理したいと考えていますが、現時点でUpdateはそれほど心配していません。DeleteInsert

最終結果は、それぞれ&である2 つのステータス フィールドactive&を持つことです。フィールドは、手動でレコードを無効にするために使用されます。フィールドに変更の値が含まれていることを確認したいと思います。inactivebitdatetimeactiveinactiveactive

理想的には、レコードのフィールドにactive=0を使用して日時スタンプを確認して配置したいと思います。now()長期的には、inactiveフィールドに日時スタンプがまだないことを検証したいと思いますが、今のところはうまくオーバーライドしています。同様に、値が存在するかどうかを確認し、フィールドactive=1をクリアしたいと考えています。inactive

inactiveフィールドはnullable競合しないようになっています。

現在のトリガー定義:

CREATE TRIGGER dbo.TRG_tblRegistration_Inactive
ON dbo.tblRegistration
AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    
    IF update(active) BEGIN
        
        update r
        set inactive=now()
        from tblRegistration r
            join inserted i on r.id = i.id
        where i.active = 0

    END
END

inserted&deletedトリガー テーブルについてはよく理解しています。

質問:

  1. トリガー内に、最終的に望ましい目標を達成するためのより良いロジック パターンはありますか?
  2. 、または?を使用してinactive値を送信する場合の考慮事項active=0active=1

トリガーの現在のフォーム:

ALTER TRIGGER dbo.TRG_tblRegistration_Inactive
ON dbo.tblRegistration
AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    
    IF update(active) BEGIN
        update r
        set inactive=getdate()
        from tblRegistration r
            join inserted i on r.id = i.id
        where i.active = 0
        
        update r
        set inactive=NULL
        from tblRegistration r
            join inserted i on r.id = i.id
        where i.active=1
    END
END

それは機能し、期待どおりに機能しますが、最初にこれを行うためのより良い方法がないことを確認したいと考えています (データベース側またはトリガーで)。

4

1 に答える 1

1

activeこの定義では、(永続化された) 計算列に変更する方がよいと思います。

CASE WHEN 非アクティブ IS NULL THEN 0 ELSE 1 END

その後、トリガーはまったく必要なくinactive = GETDATE()、目的を達成するために設定するだけです。

それにもかかわらず、トリガーが現在(両方のバージョンで)書き込まれている方法では、inactive次のようなクエリを実行しても、列は現在の日付に更新されます。

UPDATE tblRegistration
アクティブに設定 = 0
アクティブな場所 = 0

フィールドが 1 から 0 に変化した場合にのみ日付を更新する場合は、トリガーの更新ステートメントを次のようにする必要があります。

UPDATE tblRegistration
SET 非アクティブ = GETDATE()
FROM 挿入 i
INNER JOIN 削除 d ON i.id = d.id
WHERE tblRegistration.id = i.id AND i.active = 0 AND d.active = 1
于 2013-03-18T02:17:51.503 に答える