sql >> データベース >  >> RDS >> Sqlserver

特定の列が更新されたときにのみトリガーを実行する方法(SQL Server)

    SQL Serverでは、特定の列が更新されたときにのみコードを実行するDMLトリガーを作成できます。

    トリガーは引き続き起動しますが、特定の列が更新されたかどうかをテストし、その列が更新された場合にのみコードを実行できます。

    これは、UPDATE()を使用して行うことができます トリガー内で機能します。この関数は、引数として列名を受け入れます。ブール値を返します。

    表は次のとおりです:

    CREATE TABLE t1 (
        id int IDENTITY(1,1) NOT NULL,
        c1 int DEFAULT 0,
        c2 int DEFAULT 0,
        c3 int DEFAULT 0
    );

    そして、これがトリガーです:

    CREATE TRIGGER trg_t1
    ON t1
    AFTER INSERT, UPDATE
    AS
    IF ( UPDATE (c1) )
    BEGIN
    UPDATE t1
    SET c3 = c3 + 1
    WHERE id IN (SELECT DISTINCT id FROM inserted)
    END;

    この例では、t1というテーブルを作成します trg_t1というトリガー 。

    IFを使用しています UPDATE()とともにステートメント c1かどうかをテストする関数 列が更新されました。

    トリガーが実行されると、その条件が真の場合にのみ後続のコードが実行されます。

    トリガーを起動する

    行を挿入しましょう。ただし、値はc1にのみ挿入します。 列。

    INSERT INTO t1 (c1) 
    VALUES (1);
    
    SELECT * FROM t1;

    結果:

    +------+------+------+------+
    | id   | c1   | c2   | c3   |
    |------+------+------+------|
    | 1    | 1    | 0    | 1    |
    +------+------+------+------+

    予想どおり、トリガーが起動し、列c3 も更新されました。

    これは、INSERTを含めたために発生しました トリガーの定義の引数(つまり、AFTER INSERT, UPDATEを指定しました これは、データが挿入または更新されるたびにトリガーが起動されることを意味します)。 AFTER UPDATEのみを指定した場合 、データを挿入したときに起動しませんでした。既存のデータを更新するたびにのみ起動します。

    テーブルはDEFAULT 0で定義されていることに注意してください 、したがって、c2列はデフォルトでゼロになりました。

    それでは、c1を更新しましょう。 列。

    UPDATE t1 
    SET c1 = c1 + 1
    WHERE id = 1;
    
    SELECT * FROM t1;

    結果:

    +------+------+------+------+
    | id   | c1   | c2   | c3   |
    |------+------+------+------|
    | 1    | 2    | 0    | 2    |
    +------+------+------+------+

    繰り返しますが、c3 列はc1とともに更新されました 。

    それでは、c2を更新してみましょう。 列(この列はトリガーに含まれていません)。

    UPDATE t1 
    SET c2 = c2 + 1
    WHERE id = 1;
    
    SELECT * FROM t1;

    結果:

    +------+------+------+------+
    | id   | c1   | c2   | c3   |
    |------+------+------+------|
    | 1    | 2    | 1    | 2    |
    +------+------+------+------+

    今回はc2 更新されましたが、c3 そうではありませんでした。これは、c1 列は更新されておらず、トリガーはc3のみを更新します c1の場合 更新されます。

    INSERTでc1を指定せずに行を挿入した場合も、同じことが起こります。 ステートメント。

    同じ値で列を更新するとどうなりますか?

    同じ値で列を更新する場合、UPDATE() 関数はtrueを返します。

    これが例です。

    前の例から、c1列に2の値が含まれていることがわかります。 。

    その列を同じ値で明示的に更新しましょう:1

    UPDATE t1 
    SET c1 = 2
    WHERE id = 1;
    
    SELECT * FROM t1;

    結果:

    +------+------+------+------+
    | id   | c1   | c2   | c3   |
    |------+------+------+------|
    | 1    | 2    | 1    | 3    |
    +------+------+------+------+

    だから今c3 c1の値は増加しましたが、 まだ同じです。

    もう一度やりましょう。ただし、今回はそれ自体に設定します(つまり、c1 = 1を変更します。 c1 = c1へ 。

    UPDATE t1 
    SET c1 = c1
    WHERE id = 1;
    
    SELECT * FROM t1;

    結果:

    +------+------+------+------+
    | id   | c1   | c2   | c3   |
    |------+------+------+------|
    | 1    | 2    | 1    | 4    |
    +------+------+------+------+

    繰り返しますが、c3 増加しました。

    更新の試行の失敗

    UPDATE()に注意することが重要です 関数は、INSERTかどうかを示すだけです。 またはUPDATE 試行 テーブルまたはビューの指定された列で作成されました。試行が失敗した場合でも、trueが返されます。


    1. MyIsamエンジントランザクションのサポート

    2. 関数を使用して2つの日付の間の日付のリストを取得します

    3. PostgreSQLを使用したマルチデータセンターのセットアップ

    4. mysql:2つの日時の間のレコード数を取得します