SQL Serverでは、 CREATE TRIGGER
を使用できます トリガーを作成するステートメント。
トリガーは、データベースサーバーでイベントが発生したときに自動的に実行される特殊なタイプのストアドプロシージャです。
DMLトリガー、DDLトリガー、またはログオントリガーを作成できます。
この記事では、DMLトリガーを作成する例を示します。
DMLトリガーとは何ですか?
DMLトリガーは、ユーザーがデータ操作言語(DML)イベントを介してデータを変更しようとしたときに実行されるトリガーです。
DMLイベントにはINSERT
が含まれます 、 UPDATE
、または DELETE
ステートメント。 DMLトリガーを使用して、ビジネスルールとデータの整合性を適用し、他のテーブルにクエリを実行し、複雑なT-SQLステートメントを含めることができます。
トリガーとそれを起動するステートメントは単一のトランザクションとして扱われ、トリガー内からロールバックできます。
例
これは、DMLトリガーがどのように機能するかを示す例です。
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
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted);
この例では、テーブルを作成し、そのテーブルに行が挿入または更新されるたびに起動されるトリガーも作成します。
この場合、トリガーは c3
に1を追加します データが挿入または更新されるたびに列。
トリガーをtrg_t1
と呼びました 。その部分の後にONt1
を続けました 、これは、トリガーが t1
というテーブルで実行されることを意味します 。
または、トリガーを実行するビューを指定することもできますが、ビューを参照できるのは INSTEAD OF
のみです。 トリガー(この場合、 AFTER
を置き換えます INSTEAD OF
)。また、ローカルまたはグローバルの一時テーブルでDMLトリガーを定義することはできません。
AFTER
トリガーとなるSQLステートメントで指定されたすべての操作が正常に起動した場合にのみDMLトリガーが起動することを指定します。または、 FOR
を指定することもできます ここ。
もう1つの方法は、 INSTEAD OF
を使用することです。 、代わりにトリガーを実行します トリガーとなるSQLステートメントのしたがって、これはトリガーステートメントのアクションをオーバーライドします。
挿入コード>とは テーブル?
トリガーでは、 insert
をクエリすることで、どの行が更新されたかを確認できます。 テーブル。
SQL Serverは、 insert
というテーブルを作成および管理します 、これは、 INSERT
中に影響を受ける行のコピーを格納する一時的なメモリ常駐テーブルです。 およびUPDATE
ステートメント。挿入または更新トランザクション中に、新しい行が両方の insert
に追加されます テーブルとトリガーテーブル。挿入されたテーブルの行は、トリガーテーブルの新しい行のコピーです。
SQL Serverは、deletedと呼ばれる同様のテーブルも作成および維持します。このテーブルには、 DELETE
中に影響を受ける行のコピーが格納されます。 およびUPDATE
ステートメント。 DELETE
の実行中 またはUPDATE
ステートメントでは、行はトリガーテーブルから削除され、削除されたテーブルに転送されます。
トリガーを実行する
テーブルとそのトリガーが作成されたので、それをトリガーするSQLステートメントを実行してみましょう。
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1;
結果:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 0 | 1 | +------+------+------+------+
したがって、トリガーが期待どおりに機能したことがわかります。行を挿入したときに、 c1
の値のみを指定しました 列ですが、トリガーにより c3
列も更新されました。
すべての列のデフォルト値は0
であることに注意してください (テーブルを作成したときに指定したように)、トリガーがそれに1を追加しました。
UPDATE
を実行してみましょう 同じ列での操作。
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
結果:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 0 | 2 | +------+------+------+------+
もう一度、 c3
列もトリガーによって更新されました。
それでは、 c2
を更新しましょう 列。
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
結果:
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 3 | +------+------+------+------+
繰り返しになりますが、 c3
列はトリガーによって更新されます。
この特定のトリガーは、同じ行の他の列が更新されるたびに発生します。
IF UPDATE(column_name)
を使用することもできます 単一の列への更新を確認するには、または COLUMNS_UPDATED()
複数の列にわたる更新を確認します。