SQL トリガーの起動タイミング (Each Row/Each Statement)

SQL トリガーには Each Row と Each Statement といったトリガーが発火するタイミングの選択があります。

そのタイミングについてテストしながら、具体的にどういうことかを見ていきましょう。

また、注意なのですが、SQLの世界ではだいたいユーザーの名前がテーブルの名前のクオリファイアとして使用され、それは iSeriesの世界では「ライブラリー」が指定される位置になっています。
ですので必ずライブラリーと同じ名前のユーザーを作成して、そのユーザーでログインして作業してください。「ライブラリー」=「スキーマ」=「ユーザー」という意識を持って作業するようにしてください。
以下の一連の作業も QEOL というユーザーを作成し、そのユーザープロフィールでログインして行っています。


まずテストのためにテーブルを2つ作成します。

まったく同じ内容で名前だけ異なるテーブルを作成します。


まったく同じSQL文のトリガーを2つ、タイミングだけを変えて作成します。

記述するのは、更新された場合にどれだけの行がいつ更新されたかを記録するSQLです。それをそれぞれ記録するのが先に準備した2つのテーブルになります。

更新の場合、あるカラムの更新の場合のみに発火させることもできます。これは無駄にトリガーを起動させないため、パフォーマンス/キャパシティ上有効です。

まず最初のものは Each Statement (各SQLステートメント毎) にトリガーを実行する、というオプションです。

更新された行のグループを newtable という名前でアクセスします。

ここでSQL文を記述しています。更新された行のグループのカウントをとっています。

もうひとつのトリガーの記述です。

こちらは Each Row で指定します。

更新された行のグループを newtable としてアクセスするようにします。

結果を挿入するテーブルの名前以外まったく同じSQL文を記述しています。

以上のようにしてトリガーを追加すると以下のような画面になります。

この画面で「OK」を押した時に、実際のトリガーのコンパイルが始まります。


では更新を実行して結果を見ていきましょう。

まず以下のように11行、結果として更新されるSQL文を実行します。

最初のトリガー (For Each Statement が指定されている) の結果は以下のように一行です。

2つめのトリガー (For Each Row が指定されている) の結果は 11行あります。

今度は1行も更新されないSQL文を実行してみましょう。

最初のトリガー (For Each Statement が指定されている) の結果は以下のように一行あります。
newtable は空だったので、カウントが 0 になっています。

2つめのトリガー (For Each Row が指定されている) の結果は 0行です。
更新された行がひとつもないので、トリガーの内容は実行されなかった、ということです。


[Top Pageに戻る]

Ads by TOK2