C# Programming

SQL 2008

トリガ

 

1.目次

1.目次
2.トリガの生成
3.トリガの変更
4.トリガの削除

.トリガの生成

トリガは特殊なクラスのストアド プロシージャであり、テーブルまたはビューに対して UPDATE、INSERT、または DELETE の各ステートメントが実行されたときに自動的に実行されます。
テーブルは複数のトリガを持つことができます。CREATE TRIGGER ステートメントを FOR UPDATE、FOR INSERT、または FOR DELETE の各句と共に定義し、特定のクラスのデータ修正操作によってトリガを起動できます。

FOR UPDATE を指定した場合、IF UPDATE (column_name) 句を使用して、特定の列に影響を及ぼす更新によってトリガを起動できます。
 

トリガを使用すると、会社での処理を自動化できます。在庫管理システムでは、更新トリガで在庫レベルが再発注点に到達したことを検出し、自動的に供給元への注文を生成できます。工場内の工程を記録するデータベースでは、工程が定義された安全限度を超えたときに、トリガによってオペレータに電子メールやポケットベルで通知できます。

次のトリガは、pubs データベース内に新しいタイトルが追加されると必ず電子メールを生成します。
 

CREATE TRIGGER reminder
ON titles
FOR INSERT
AS
EXEC master..xp_sendmail 'MaryM',
'New title, mention in the next report to distributors.'

トリガには、ストアド プロシージャとまったく同じように、Transact-SQL ステートメントが入っています。トリガはストアド プロシージャのように、そのトリガ内に SELECT ステートメントがあれば、そのステートメントで生成された結果セットを返します。トリガには、パラメータを書き込むだけのステートメント以外の SELECT ステートメントを含めないことをお勧めします。これは、ユーザーが UPDATE、INSERT、または DELETE の各ステートメントから返される結果セットを見ることがないからです。
FOR 句を使用して、いつトリガを実行するかを指定できます。
 

  • AFTER
    トリガは、そのトリガを起動したステートメントが完了した後に実行されます。そのステートメントが制約違反や構文エラーなどのエラーで終了した場合、トリガは実行されません。AFTER トリガはテーブルに対してのみ指定できます。ビューに対しては指定できません。個々のトリガ動作 (INSERT、UPDATE または DELETE) に対して複数の AFTER トリガを指定できます。1 つのテーブルに対して複数の AFTER トリガが指定されている場合は、sp_settriggerorder を使用して、どの AFTER トリガを最初に起動し、どの AFTER トリガを最後に起動するかを定義できます。最初と最後に起動される AFTER トリガ以外のすべての AFTER トリガが起動される順序は定義されず、この順序を制御することはできません。
    SQL Server 2000 では AFTER が既定の設定です。SQL Server Version 7.0 以前のバージョンでは、すべてのトリガが AFTER トリガとして動作したため、AFTER または INSTEAD OF を指定することはできませんでした。
     
  • INSTEAD OF
    トリガ動作の代わりにトリガが実行されます。INSTEAD OF トリガは、テーブルにもビューにも指定できます。個々のトリガ動作 (INSERT、UPDATE または DELETE) に対して 1 つの INSTEAD OF トリガのみを指定できます。INSTEAD OF トリガを使用して、INSERT ステートメントおよび UPDATE ステートメントから渡されるデータ値に対して拡張整合性チェックを実行することができます。INSTEAD OF トリガを使用すると、通常は更新をサポートしないビューを更新可能にする動作を指定することができます

.1 CREATE TRIGGER構文

CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{

    { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
        [ WITH APPEND ]
        [NOT FOR REPLICATION]
        AS
        [ { IF UPDATE ( column )
            [ { AND | OR } UPDATE ( column ) ]
                [ ...n ]
        | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
                { comparison_operator } column_bitmask [ ...n ]
        } ]
        
sql_statement [ ...n ]
    }
}

.トリガの変更

 

.1 ALTER TRIGGER構文

ALTER TRIGGER trigger_name
ON ( table | view )
[ WITH ENCRYPTION ]
{
    {
( FOR | AFTER | INSTEAD OF ) { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
        [NOT FOR REPLICATION]
        AS
        
sql_statement [ ...n ]
    }
    |
    {
( FOR | AFTER | INSTEAD OF ) { [ INSERT ] [ , ] [ UPDATE ] }
        [NOT FOR REPLICATION]
        AS
        { IF UPDATE ( column )

        [ { AND | OR } UPDATE ( column ) ]
        [ ...
n ]
        | IF
( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
        { comparison_operator } column_bitmask [ ...n ]
        }
        
sql_statement [ ...n ]
    }
}

.トリガの削除

DRIP TRIGGER TR_MYTRIGGER

.1 DROP TRIGGER構文

DROP TRIGGER { trigger } [ ,...n ]