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

SQLServerでDMLトリガーを作成する

    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() 複数の列にわたる更新を確認します。


    1. PostgreSQLインデックスを最大限に活用する

    2. PostgreSQLの特定のスキーマですべてのオブジェクトの所有権を変更するにはどうすればよいですか?

    3. OracleのASCII()関数

    4. Python:MySQLに接続してクエリを実行するためのベストプラクティスと最も安全な方法