検索

イベント・ベース処理を実現するトリガー


トリガーの概念

Teradataデータベースのトリガー機能は ANSI SQL 2003 に準拠し、一部の機能を拡張しています※1。トリガーは、トリガーを仕掛けたテーブルで挿入・削除・更新などのデータ操作が行われると、それをきっかけに事前に設定したアクションを自動的に起動する機能を提供します(図1)。これにより、例えばある商品の在庫数が特定の数を下回った場合に、発注処理を行うためのストアド・プロシージャを起動するといったビジネスロジックをデータベースに埋め込むことが可能になります。トリガーは、CREATE TRIGGER文で作成するデータベース・オブジェクトであり(図2)、DROP TRIGGER文で削除することができます。また ALTER TRIGGER文で、作成したトリガーの有効化・無効化を設定することができます。無効化してもトリガー・オブジェクトそのものは消えませんが、機能は停止状態になるため、トリガー・イベントが発生してもアクションは起動されません※2。

トリガーの機能と種類

トリガーの動作は 3つの属性、すなわちトリガーを起動するイベント、トリガーが実行されるタイミング、そしてトリガー・アクションが実行される頻度によって制御されます(表1)。

1. トリガーを起動するイベント

トリガー・イベントは、トリガーを起動するきっかけとなるイベントのことです。トリガー・イベントは、特定のテーブルに対する INSERT、DELETE、または UPDATE操作のいずれかであり、トリガーを作成する際にどれか 1つを指定します。

2. トリガーが実行されるタイミング

トリガーは、そのアクションを実行するタイミングをトリガー・イベントであるデータ変更操作の前に行うか、それとも後で行うかを選択できます。トリガー・イベントの前に実行されるトリガーを“BEFOREトリガー”、後で実行されるトリガーを“AFTERトリガー” と言います※3。なお、BEFOREトリガーは、そのアクションにデータ変更操作を指定することはできません。

3.トリガーが実行される頻度

トリガーには、トリガー・イベントによって複数の行が変更される場合に、各行ごとに起動される“行トリガー” と、変更される行の数とは関わりなく 1回だけ起動される“文トリガー” があります。例えば行トリガーは、トリガー・イベントで 10行変更されると 10回起動されますが、変更がなければ 1度も起動されません。一方で文トリガーは、10行変更されても、また 1行も変更されなくても 1回だけ起動されます。さらに、行トリガーは BEFOREトリガーと AFTERトリガーの両方を指定することができますが、文トリガーは AFTERトリガーのみ指定できます。従って、文トリガーは、トリガー・イベントの後に 1回だけアクションを起動することが可能です。なお、行トリガーと文トリガーのどちらを使用してもロジックを実装できる場合、ほとんどのケースで文トリガーの方がパフォーマンスは向上します。

また、トリガー文に REFERENCING句を用いることで、変更操作が行われる前後の状態の行やテーブルを一時的に作成し、参照のためにアクセスすることができます。WHEN句の中でこの参照を用いると、アクションを起動する条件を絞り込めるため、不要なアクションの実行を回避し、より効率的なロジックを記述できます。

複数のトリガーとトリガーのカスケード
1.複数トリガーの実行順序

1つのテーブルに対して複数のトリガーを設定できます。BEFOREトリガーと AFTERトリガーが 1つのテーブルに対して設定されている場合であれば、最初に BEFOREトリガーが実行され、次に AFTERトリガーが実行されます。しかし、同じタイプのトリガーが複数設定されている場合、どのような順序でトリガーは起動されるでしょうか。この順序を決定するのは、トリガーを作成したタイムスタンプと、実行順序を任意に指定することができる ORDER句のいずれかになります。ORDER句の指定はタイムスタンプより優先されますが、もし複数のトリガーが同じ ORDER値を使用している場合は、タイムスタンプにより判断されます(図3)。

2.トリガーのカスケード

前述のとおり、トリガーは対象テーブルに、INSERT、DELETE、UPDATE などの変更操作が行われると起動されます。BEFOREトリガーはアクションに変更操作を指定できませんが、AFTERトリガーは可能なため、AFTERトリガーによる変更操作が別のトリガーを起動することがあります。これをトリガーのカスケードと呼びますが、カスケードの連鎖が無限ループすること(図4)を防止するために、システムはカスケードの数を 16 に制限しています※4。

まとめ

トリガーはデータベースの特定のテーブルに対して行われた変更操作をイベントとして検知し、事前に定義したアクションを実行する機能を提供します。また、トリガーは実行するタイミングや頻度などをその定義によって柔軟に使い分けることができ、1つのテーブルに対して複数のトリガーを設定することも可能です。

データウェアハウスの膨大な情報の変化を人の目で監視することは困難ですが、トリガーを適切に作成しておくことで、データの変更を迅速に捉えてアクションに結びつけることが可能になります。これにより、複雑なビジネスルールの実装をはじめ、監査やセキュリティの向上、保守コストの削減、ネットワーク・トラフィックの削減によるパフォーマンス改善など、さまざまなメリットが期待できます。

トリガーによって、さまざまなビジネスロジックをデータベース内部に埋め込む、イベント・ベース処理が実現できますので、是非ご活用ください。

  • ※1 REPLACE TRIGGER文や有効化/無効化のオプションは ANSI SQL 2003 に対する Teradata の拡張機能です。

  • ※2 Teradata のロード・ユーティリティを使用してトリガーが設定されているテーブルにデータをロードする際は、トリガーを事前に無効化する必要があります。

  • ※3 以前はトリガー・イベントを実行せずに、トリガー・アクションのみを起動する INSTEAD OFトリガーもサポートしていましたが、ANSI の定義から削除されたことに伴い、Teradata V2R5.1 で廃止されました。

  • ※4 トリガーのカスケードがこの制限を超過すると、システムはその要求をロールバックします。


eventbanner.png