SQL 解説書
CREATE TRIGGER ステートメントは、データベースにトリガーを定義します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、
または動的 SQL ステートメントを使用して発行することができます。
このステートメントは、動的に準備可能な実行可能ステートメントです。
しかし、バインド・オプション DYNAMICRULES BIND を適用する場合、
ステートメントを動的に準備することはできません (SQLSTATE 42509)。
許可
トリガーを作成する際に、
このステートメントの許可 ID には以下の特権が少なくとも 1 つ含まれている必要があります。
- SYSADM または DBADM 権限
- トリガーを定義する表に対する ALTER 特権、
またはトリガーを定義する表のスキーマに対する ALTERIN 特権、および以下のいずれか。
- データベースに対する IMPLICIT_SCHEMA 権限 (トリガーの暗黙または明示のスキーマ名が存在しない場合)
- スキーマに対する CREATEIN 特権 (トリガーのスキーマ名が既存のスキーマを指している場合)。
このステートメントの許可 ID に SYSADM 権限または DBADM 権限がない場合には、
トリガーが存在する限り、
ステートメントの許可 ID が持つ特権 (PUBLIC 特権またはグループ特権は考慮に入れない) に
以下のすべてが含まれている必要があります。
- 変換変数または表を指定する場合は、トリガーを定義する表に対する SELECT 特権
- トリガー・アクション条件で参照される表または視点に対する SELECT 特権
- 指定したトリガー SQL ステートメントを呼び出すために必要な特権
SYSADM 権限を所持しているために、
トリガーの定義者がトリガーの作成しか行えないような場合、
その定義者には、トリガーを作成できるようにする目的で明示的な DBADM 権限が付与されます。
構文
>>-CREATE TRIGGER--trigger-name----+-NO CASCADE BEFORE-+-------->
'-AFTER-------------'
>-----+-INSERT-----------------------------+--ON--table-name---->
+-DELETE-----------------------------+
'-UPDATE--+------------------------+-'
| .-,--------------. |
| V | |
'-OF----column-name---+--'
>-----+----------------------------------------------------------------------+>
| .----------------------------------------------------. |
| V (1) (2) .-AS-. | |
'-REFERENCING-------------------+-OLD--+----+--correlation-name--+--+--'
| .-AS-. |
+-NEW-+----+--correlation-name---+
| .-AS-. |
+-OLD_TABLE-+----+--identifier---+
| .-AS-. |
'-NEW_TABLE-+----+--identifier---'
>-----+-FOR EACH ROW---------------+--MODE DB2SQL--------------->
| (3) |
'--------FOR EACH STATEMENT--'
>-----| triggered-action |-------------------------------------><
triggered-action
|--+-------------------------------+---------------------------->
'-WHEN--(--search-condition--)--'
>-----+-triggered-SQL-statement--------------------------------+-|
| .-------------------------------. |
| V | |
'-BEGIN ATOMIC-----triggered-SQL-statement--;---+---END--'
注:
- OLD と NEW は、それぞれ一度だけ指定できます。
- OLD_TABLE と NEW_TABLE は、それぞれ一度だけ、
AFTER トリガーに対してのみ指定できます。
- FOR EACH STATEMENT は、BEFORE トリガーには指定できません。
説明
- trigger-name
- トリガーの名前を指定します。
暗黙のスキーマ名または明示スキーマ名を含む名前は、
カタログにすでに記述されているトリガーを指定するものであってはなりません (SQLSTATE 42710)。
2 つの部分からなる名前を指定する場合、
"SYS" で始まるスキーマ名は使用できません (SQLSTATE 42939)。
- NO CASCADE BEFORE
- 対象となる表の実際の更新によって生じる変更がデータベースに適用される前に、
関連するトリガー・アクションを適用することを指定します。
また、このトリガーのトリガー・アクションが、
他のトリガーを活動化することがないことも指定します。
- AFTER
- 対象となる表の実際の更新によって生じる変更がデータベースに適用された後で、
関連するトリガー・アクションを適用することを指定します。
- INSERT
- 指定した基礎表に INSERT 操作が適用される場合には必ず、
このトリガーに関連するトリガー・アクションを実行することを指定します。
- DELETE
- 指定した基礎表に DELETE 操作が適用される場合には必ず、
このトリガーに関連するトリガー・アクションを実行することを指定します。
- UPDATE
- 指定した列または暗黙に指定される列に従って、
指定した基礎表に UPDATE 操作が適用される場合には必ず、
このトリガーに関連するトリガー・アクションを実行することを指定します。
オプションの column-name のリストの指定がない場合、
暗黙に表のすべての列が指定されます。
したがって、column-name リストを省略すると、
表の列のいずれかの更新によってトリガーが活動化されることが暗に指定されます。
- OF column-name,...
- 指定する各 column-name (列名) は、
基礎表の列でなければなりません (SQLSTATE 42703)。
トリガーが BEFORE トリガーである場合、指定される column-name は、
識別列以外の生成列ではありません (SQLSTATE 42989)。
column-name リストの 1 つの column-name を
複数回指定することはできません (SQLSTATE 42711)。
トリガーは、column-name リストに指定した列が更新される場合にのみ
活動化されることになります。
- ON table-name
- トリガー定義の対象となる表を指定します。
table-name に指定する名前は、基礎表、
または解決結果が基礎表になる別名でなければなりません (SQLSTATE 42809)。
この名前に、カタログ表 (SQLSTATE 42832)、要約表 (SQLSTATE 42997)、
宣言された一時表 (SQLSTATE 42995)、
あるいはニックネーム (SQLSTATE 42809) を指定することはできません。
- REFERENCING
- 変換変数 の相関名と変換表 の表名を指定します。
相関名には、トリガーとなる SQL 操作によって影響を受ける一連の行の中の特定の行を指定します。
表名には、影響を受ける行の集合全体を指定します。
トリガーとなる SQL 操作によって影響を受ける各行をトリガー・アクションで使用するには、
次のようにして指定される correlation-name (相関名) によって列を修飾します。
- OLD AS correlation-name
- トリガーとなる SQL 操作の前の時点での行の状態を指定する相関名を指定します。
- NEW AS correlation-name
- トリガーとなる SQL 操作によって変更された行が、
すでに実行された BEFORE トリガーの SET ステートメントによってさらに変更された時の状態を指定する
相関名を指定します。
トリガーとなる SQL 操作によって影響を受ける行全体の集合をトリガー・アクションで使用するには、
次のように指定される一時表名を使用します。
- OLD_TABLE AS identifier
- 影響を受ける行の集合の、
トリガーとなる SQL 操作の前のものを指定する一時表名を identifier に指定します。
- NEW_TABLE AS identifier
- トリガーとなる SQL 操作による影響を受けた行が、
すでに実行された BEFORE トリガーによってさらに変更された状態を指定する
一時表名を identifier に指定します。
REFERENCING 文節には、次の規則が適用されます。
- OLD および NEW の相関名と、OLD_TABLE および NEW_TABLE の名前は、
いずれも同じであってはなりません (SQLSTATE 42712)。
- 1 つのトリガーには、correlation-name として、
1 つの OLD と 1 つの NEW だけしか指定できません (SQLSTATE 42613)。
- 1 つのトリガーには、
identifier として 1 つの OLD_TABLE と 1 つの NEW_TABLE しか
指定できません (SQLSTATE 42613)。
- OLD correlation-name と OLD_TABLE identifier は、
トリガー・イベントが DELETE 操作または UPDATE 操作のいずれかである場合にしか
使用できません (SQLSTATE 42898)。
操作が DELETE 操作の場合、OLD correlation-name は、
削除された行の値を捕らえるものとなります。操作が UPDATE 操作の場合、
その UPDATE 操作の前の時点での行の値を捕らえるものとなります。
同じことが OLD_TABLE identifier と
それによって影響を受ける行の集合にも適用されます。
- NEW correlation-name と NEW_TABLE identifier は、
トリガー・イベントが INSERT 操作または UPDATE 操作のいずれかである場合にしか
使用できません (SQLSTATE 42898)。
どちらの操作でも、NEW の値は、元の操作による行の新しい状態が、
その時点までに実行された BEFORE トリガーによってさらに変更されたものを捕らえます。
同じことが NEW_TABLE identifier とそれによって影響を受ける行の集合にも
適用されます。
- OLD_TABLE identifier と NEW_TABLE identifier は、
BEFORE トリガーには定義できません (SQLSTATE 42898)。
- OLD correlation-name と NEW correlation-name は、
FOR EACH STATEMENT トリガーには定義できません (SQLSTATE 42899)。
- 変換表は変更できません (SQLSTATE 42807)。
- トリガー・アクションの中での変換表の列と変換変数への参照の合計回数が、
表内の列数の限界を超えてはなりません。また、その長さの合計が、
表の中の行の最大長を超えてはなりません (SQLSTATE 54040)。
- 各 correlation-name と各 identifier の効力範囲は、
トリガー定義全体です。
- FOR EACH ROW
- 対象となる表の行で、
トリガーとなる SQL 操作によって影響を受ける各行ごとに、
トリガー・アクションが一度ずつ適用されるよう指定します。
- FOR EACH STATEMENT
- トリガー・アクションが、
ステートメント全体で一度だけ適用されることを指定します。
このタイプのトリガー細分性は、BEFORE トリガーには指定できません (SQLSTATE 42613)。
指定すると、
トリガーとなる UPDATE または DELETE ステートメントによって影響を受ける行がない場合でも、
UPDATE トリガーまたは DELETE トリガーが活動化されることになってしまいます。
- MODE DB2SQL
- この文節は、トリガーのモードを指定するために使用します。
これは、現在サポートされている唯一有効なモードです。
- triggered-action
- トリガーが活動化された時に実行されるアクションを指定します。
1 つのトリガー・アクションは、
1 つまたはいくつかの triggered-SQL-statement と、
その triggered-SQL-statement が実行されるためのいくつかのオプション条件によって構成されます。
指定するトリガー・アクションに複数の triggered-SQL-statement がある場合、
これらを BEGIN ATOMIC キーワードと END キーワードで囲んでセミコロンで区切る必要があります。
83
それらは、指定された順序で実行されます。
- WHEN (search-condition)
- 真、偽、または未知となる条件を指定します。
search-condition (探索条件) を使うことによって、
特定のトリガー・アクションを実行するかどうかを決めることができます。
関連するアクションは、指定した探索条件が真と評価される場合にのみ実行されます。
WHEN 文節を省略すると、
関連する triggered-SQL-statement は常に実行されることになります。
- triggered-SQL-statement
- トリガーが BEFORE トリガーの場合、トリガーにより実行される SQL ステートメントは、
次のいずれかでなければなりません (SQLSTATE 42987)。
- 全選択84
- SET 変換変数 SQL ステートメント
- SIGNAL SQLSTATE ステートメント
トリガーが AFTER トリガーの場合、トリガーにより実行される SQL ステートメントは、
次のいずれかでなければなりません (SQLSTATE 42987)。
- INSERT SQL ステートメント
- 探索 UPDATE SQL ステートメント
- 探索 DELETE SQL ステートメント
- SIGNAL SQLSTATE ステートメント
- 全選択84
triggered-SQL-statement で、未定義の変換変数 (SQLSTATE 42703) や、
宣言された一時表 (SQLSTATE 42995) を参照することはできません。
BEFORE トリガーの triggered-SQL-statement は、
REFRESH IMMEDIATE を定義した要約表を参照できません (SQLSTATE 42997)。
BEFORE トリガーの triggered-SQL-statement は、
新しい変換変数で識別列以外の生成列を参照することはできません (SQLSTATE 42989)。
注
- すでに行が含まれている表にトリガーを追加しても、
トリガー・アクションは活動化されません。
そのため、トリガーが表内のデータに制約を適用するように設計されている場合、
既存の行についてはそれらの制約が満たされない可能性があります。
- 2 つのトリガーのイベントが同時に発生する場合 (たとえばイベント、活動化のタイミング、
および対象の表が同じである場合)、最初に作成されたトリガーが最初に実行されます。
- トリガーの定義後に対象の表に列が追加された場合、次の規則が適用されます。
- トリガーが、明示的な列リストなしで指定された UPDATE トリガーである場合、
新しい列への更新によってトリガーが活動化されます。
- その列は、それ以前に定義されたトリガーのトリガー・アクションからは見えません。
- OLD_TABLE および NEW_TABLE の各変位表に、この列は含まれません。
したがって、変換表に対して "SELECT *" を実行しても、追加列は含められません。
- トリガー・アクションで参照される表に 1 つの列を追加した場合、
新しい列はそのトリガー・アクションからは見えません。
- triggered-SQL-statement として指定された全選択の結果は、
トリガーの内部でも外部でも使用できません。
- カスケードされた参照制約のサイクルに関係のある表に対して定義された削除前トリガーは、
そのトリガーが定義されている表への参照や、
参照保全制約のサイクルの評価中にカスケードされて変更された他の表への参照には含めないでください。
そのようなトリガーを含めると、結果がデータによってまちまちになり、
一貫性のない状態が生じてしまう可能性があります。
このようなトリガーをもっとも簡明な形式にする方法は、
自己参照の参照制約のある表に対する削除前トリガーや CASCADE の削除規則には、
triggered-action に関係のある表への参照は含めないようにすることです。
- トリガーを作成すると、特定のパッケージは無効として扱われるようになります。
- 明示的な列リストなしの更新トリガーを作成した場合、
ターゲット表に対して更新操作を使用するパッケージは無効になります。
- 列リストを指定した更新トリガーを作成した場合、
ターゲット表に対して更新操作を使用するパッケージは、そのパッケージにおいて、
CREATE TRIGGER ステートメントの column-name リストの中の
少なくとも 1 つの列に対しても更新を使用する場合にのみ無効になります。
- 挿入トリガーを作成した場合、
ターゲット表に対して挿入操作を使用するパッケージは無効になります。
- 削除トリガーを作成した場合、
ターゲット表に対して削除操作を使用するパッケージは無効になります。
- パッケージは、アプリケーション・プログラムが明示的にバインドまたは再バインドされるまで、
あるいはアプリケーション・プログラムが実行されてデータベースが自動的にそれを再バインドするまで、
無効のままになります。
- 作動不能トリガー:
作動不能トリガー は、使用可能でなくなったために活動化されないトリガーです。
トリガーは、次の場合に作動不能になります。
- トリガーの作成者から、そのトリガーを実行するために必要な特権が取り消された場合。
- トリガー・アクションが従属している表、視点、
または別名などのオブジェクトが除去された場合。
- トリガー・アクションが従属している視点が作動不能になった場合。
- トリガーの対象の表である別名が除去された場合。
実際には、作動不能トリガーとは、
DROP ステートメントまたは REVOKE ステートメントのカスケード規則の結果として、
トリガー定義が除去されたトリガーです。
たとえば、視点が除去されると、
その視点を使用して定義された triggered-SQL-statement は作動不能になります。
トリガーが作動不能になると、
それまでそのトリガーを活動化していた操作を実行するステートメントの含まれるパッケージすべてが無効になります。
パッケージが (明示的にまたは暗黙のうちに) 再バインドされるとき、
作動不能トリガーは完全に無視されます。
同様に、トリガーを活動化していた操作を実行する動的 SQL ステートメントを含むアプリケーションも、
作動不能トリガーを完全に無視します。
トリガー名は、DROP TRIGGER および COMMENT ON TRIGGER の各ステートメントにも指定できます。
作動不能トリガーは、その作動不能トリガーの定義テキストを使用して、
CREATE TRIGGER ステートメントを発行することにより再び作成できます。
このトリガー定義テキストは、SYSCAT.TRIGGERS の TEXT 列に保管されています。
作動不能トリガーを再作成するために、それを明示的に削除する必要はありません。
作動不能トリガーと同じトリガー名 (trigger-name) を使用して CREATE TRIGGER ステートメントを発行すると、
その作動不能トリガーは置換され、警告 (SQLSTATE 01595) が出されます。
作動不能トリガーであることは、
SYSCAT.TRIGGERS カタログ視点の VALID 列が X であることによって示されます。
- Errors executing triggers:
triggered-SQL-statements の実行時に発生したエラーは、
エラーが重大であると見なされた場合以外は SQLSTATE 09000 を用いて戻されます。
エラーが重大な場合は、重大エラーの SQLSTATE が戻されます。
重大でないエラーの場合の SQLCA の SQLERRMC フィールドには、
トリガー名、SQLCODE、SQLSTATE、
およびエラーのトークンの中からフィールドに入るだけの数のトークンが入れられます。
triggered-SQL-statement は、SIGNAL SQLSTATE ステートメントにすることも、
また RAISE_ERROR 関数を含めることもできます。
いずれの場合でも、戻される SQLSTATE は、
SIGNAL SQLSTATE ステートメントまたは RAISE_ERROR 条件で指定されたものになります。
- まだ存在していないスキーマ名を用いてトリガーを作成すると、
ステートメントの許可 ID に IMPLICIT_SCHEMA 権限がある場合に限り、
そのスキーマが暗黙的に作成されます。
そのスキーマの所有者は SYSIBM です。
スキーマに対する CREATEIN 特権は PUBLIC に与えられます。
- データベース・マネージャーが識別列用に生成する値は、
どの BEFORE トリガーの実行よりも前に生成されます。
したがって、生成される識別値は BEFORE トリガーにとって可視の値です。
- 生成された式列用にデータベース・マネージャーが生成する値は、
どの BEFORE トリガーの実行よりも後に生成されます。
したがって、その式で生成される値は、BEFORE トリガーにとって可視でない値です。
- トリガーおよびタイプ付き表:
表階層のどのレベルのタイプ付き表にも、トリガーを付加することができます。
SQL ステートメントが複数のトリガーを活動化する場合、
それらのトリガーは、それぞれタイプ付き表階層の別々の表に付加されていても、
作成順に実行されます。
トリガーが活動化されたとき、
その変換変数 (OLD、NEW、OLD_TABLE、および NEW_TABLE) 内に副表の行が入っていることがあります。
ただし、付加先の表で定義されている列しか入っていません。
INSERT、UPDATE、および DELETE ステートメントの効果は次のとおりです。
- 行トリガー: SQL ステートメントを使って表行の INSERT、UPDATE、または DELETE を行うと、
このステートメントは、行の入った最も限定的な表と
その表のすべての副表に付加されている行トリガーを活動化します。
SQL ステートメントがどのように表にアクセスするかに関係なく、常にこのようになります。
たとえば、UPDATE EMP コマンドを発行すると、
更新済みの行の一部が、副表 MGR に入ることがあります。
EMP 行の場合、EMP とそのスーパー表に付加されている行トリガーが活動化されます。
MGR 行の場合、MGR とそのスーパー表に付加されている行トリガーが活動化されます。
- ステートメント・トリガー: INSERT、UPDATE、または DELETE ステートメントは、
このステートメントによって影響を受ける可能性のある表 (および
そのスーパー表) に付加されているステートメント・トリガーを活動化します。
そのような表内の実際の行が影響を受けたかどうかに関係なく、常にそのようになります。
たとえば、INSERT INTO EMP コマンドで、
EMP とそのスーパー表のステートメント・トリガーを活動化します。
別の例として、副表行が更新も削除もされていない場合でも、
UPDATE EMP または DELETE EMP コマンドで、
EMP とそのスーパー表のステートメント・トリガーが活動化されます。
同様に、UPDATE ONLY (EMP) または DELETE ONLY (EMP) コマンドは、
EMP とそのスーパー表のステートメント・トリガーを活動化しますが、
副表のステートメント・トリガーは活動化しません。
DROP TABLE ステートメントの効果: DROP TABLE ステートメントは、
除去しようとしている表に付加されているどのトリガーも活動化しません。
ただし、除去される表が副表である場合、
その除去される表の行すべては、スーパー表から削除されるものとみなされます。
したがって、表 T の場合は次のようになります。
- 行トリガー: DROP TABLE T は、T の行ごとに、
T のすべてのスーパー表に付加されている行タイプの削除トリガーを活動化します。
- ステートメント・トリガー: DROP TABLE T は、T に行が入っているかどうかに関係なく、
T のすべてのスーパー表に付加されているステートメント・タイプの削除トリガーを活動化します。
視点でのアクション: 視点でのアクションによってどのトリガーが活動化されるかを予測するには、
視点定義を使ってそのアクションを、基礎表でのアクションに変換します。
たとえば、次のようにします。
- SQL ステートメントで UPDATE V1 を実行します。
V1 は、副視点 V2 をもつタイプ付き視点です。
V1 は基礎表 T1 をもち、V2 は基礎表 T2 をもっているとします。
ステートメントは、T1、T2、およびそれらの副表に影響を与える可能性があるので、
T1 と T2 およびそのすべての副表とスーパー表のステートメント・トリガーが活動化されます。
- SQL ステートメントで UPDATE V1 を実行します。
V1 は、副視点 V2 をもつタイプ付き視点です。
V1 は SELECT ... FROM ONLY(T1) と定義されていて、
V2 は SELECT ... FROM ONLY(T2) と定義されていると仮定します。
ステートメントは、T1 と T2 の副表内の行には影響を与えないので、
T1 と T2 およびそれぞれのスーパー表のステートメント・トリガーは活動化されますが、
これらの表の副表のものは活動化されません。
- SQL ステートメントで UPDATE ONLY(V1) を実行します。
V1 は、SELECT ... FROM T1 と定義されたタイプ付き視点です。
ステートメントは、T1 とその副表に影響を与える可能性があります。
したがって、T1 とそのすべての副表とスーパー表のステートメント・トリガーが活動化されます。
- SQL ステートメントで UPDATE ONLY(V1) を実行します。
V1 は、SELECT ... FROM ONLY(T1) と定義されたタイプ付き視点です。
この場合、V1 が副視点をもち T1 が副表をもっていても、
T1 だけがステートメントから影響を受けることができます。
したがって、T1 とそのスーパー表のステートメント・トリガーが活動化されます。
例
例 1:
会社が管理する従業員の数の自動追跡を実行する 2 つのトリガーを作成します。
このトリガーは、次の表に作用します。
- EMPLOYEE 表 (列は ID、NAME、ADDRESS、および POSITION)
- COMPANY_STATS 表 (列は NBEMP、NBPRODUCT、および REVENUE)
最初のトリガーは、
新しい従業員を採用するたびに (つまり EMPLOYEE 表に新しい行が挿入されるたびに)、
従業員数に 1 を加算します。
CREATE TRIGGER NEW_HIRED
AFTER INSERT ON EMPLOYEE
FOR EACH ROW MODE DB2SQL
UPDATE COMPANY_STATS SET NBEMP = NBEMP + 1
2 番目のトリガーは、
従業員が会社を退職するたびに (つまり EMPLOYEE 表から行が削除されるたびに)、
従業員数から 1 を減算します。
CREATE TRIGGER FORMER_EMP
AFTER DELETE ON EMPLOYEE
FOR EACH ROW MODE DB2SQL
UPDATE COMPANY_STATS SET NBEMP = NBEMP - 1
例 2:
部品のレコードが更新されると、
以下の検査と (必要ならば) アクションを実行するトリガーを作成します。
- 手持ち数量 (ON_HAND) が最大在庫量 (MAX_STOCKED) の 10% 未満になった場合、
その部品の品目数として最大在庫量から手持ち数量を引いた数を指定した出荷依頼書を発行します。
このトリガーは、PARTNO、DESCRIPTION、ON_HAND、MAX_STOCKED、
および PRICE の列を含む PARTS 表に作用します。
ISSUE_SHIP_REQUEST は、追加部品の注文書を、発注先に送るユーザー定義関数です。
CREATE TRIGGER REORDER
AFTER UPDATE OF ON_HAND, MAX_STOCKED ON PARTS
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN (N.ON_HAND < 0.10 * N.MAX_STOCKED)
BEGIN ATOMIC
VALUES(ISSUE_SHIP_REQUEST(N.MAX_STOCKED - N.ON_HAND, N.PARTNO));
END
例 3:
更新の結果、現行の給与の 10 % を超える昇給になった場合にエラーを生じさせるトリガーを作成します。
CREATE TRIGGER RAISE_LIMIT
AFTER UPDATE OF SALARY ON EMPLOYEE
REFERENCING NEW AS N OLD AS O
FOR EACH ROW MODE DB2SQL
WHEN (N.SALARY > 1.1 * O.SALARY)
SIGNAL SQLSTATE '75000' ('Salary increase>10%')
例 4:
株価の変更を記録し追跡するアプリケーションについて考えます。
データベースには、CURRENTQUOTE および QUOTEHISTORY という 2 つの表が含まれています。
表: CURRENTQUOTE (SYMBOL, QUOTE, STATUS)
QUOTEHISTORY (SYMBOL, QUOTE, QUOTE_TIMESTAMP)
CURRENTQUOTE の QUOTE (相場) 列が更新されると、
新しい相場とタイム・スタンプを QUOTEHISTORY 表にコピーするようにします。
CURRENTQUOTE の STATUS (状況) 列も、
次のような株の状況が反映されるように更新します。
- 値上がり
- 今年の新高値
- 値下がり
- 今年の新安値
- 変わらず
これを実現する CREATE TRIGGER ステートメントは、次のようになります。
- 状況を設定するトリガーの定義
CREATE TRIGGER STOCK_STATUS
NO CASCADE BEFORE UPDATE OF QUOTE ON CURRENTQUOTE
REFERENCING NEW AS NEWQUOTE OLD AS OLDQUOTE
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
SET NEWQUOTE.STATUS =
CASE
WHEN NEWQUOTE.QUOTE >
(SELECT MAX(QUOTE) FROM QUOTEHISTORY
WHERE SYMBOL = NEWQUOTE.SYMBOL
AND YEAR(QUOTE_TIMESTAMP) = YEAR(CURRENT DATE) )
THEN 'High'
WHEN NEWQUOTE.QUOTE <
(SELECT MIN(QUOTE) FROM QUOTEHISTORY
WHERE SYMBOL = NEWQUOTE.SYMBOL
AND YEAR(QUOTE_TIMESTAMP) = YEAR(CURRENT DATE) )
THEN 'Low'
WHEN NEWQUOTE.QUOTE > OLDQUOTE.QUOTE
THEN 'Rising'
WHEN NEWQUOTE.QUOTE < OLDQUOTE.QUOTE
THEN 'Dropping'
WHEN NEWQUOTE.QUOTE = OLDQUOTE.QUOTE
THEN 'Steady'
END;
END
- 変更内容を QUOTEHISTORY 表に記録するトリガーの定義
CREATE TRIGGER RECORD_HISTORY
AFTER UPDATE OF QUOTE ON CURRENTQUOTE
REFERENCING NEW AS NEWQUOTE
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
INSERT INTO QUOTEHISTORY
VALUES (NEWQUOTE.SYMBOL, NEWQUOTE.QUOTE, CURRENT TIMESTAMP);
END
脚注:
- 83
-
コマンド行プロセッサーでこの形式を使用する場合、
ステートメントの終了文字をセミコロンにすることはできません。
代替の終了文字の指定については、コマンド解説書 を参照してください。
- 84
-
全選択の前に共通表式を指定できます。
[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]