トリガー・ファンクションの作成
ファンクションをトリガー・ファンクションとして定義するには、FUNCTIONコマンドでTRIGGERパラメータを使用します。
ファンクションをデータ・ディクショナリ・レベルのトリガーとして動作させる場合は、このパラメータの最初の部分に*FIELDと入力し、2番目の部分に、関連付けるデータ・ディクショナリ・フィールド名を入力します。
ファンクションをデータベース・レベルのトリガーとして動作させる場合は、パラメータの最初の部分に*FILEと入力し、2番目の部分に、関連付けるデータベース・テーブル名を入力します。指定するテーブルは、インデックスではなく物理テーブルでなければなりません。
新しいトリガー・ファンクションを容易に定義できるよう、LANSAには、トリガー・ファンクションの土台として使用できる以下のアプリケーション・テンプレートが付属しています。
BBFLDTRIG
|
フィールド・レベルのトリガー・ファンクション
|
BBFILTRIG
|
テーブル・レベルのトリガー・ファンクション
|
ファンクションをトリガー・ファンクションとして定義するときは、以下のガイドラインに従う必要があります。
- パラメータRCV_LIST(#TRIG_LIST)を使用してください。
- オプションxxx_SYSTEM_VARIABLEまたはxxx_FIELD_VALIDATEは使用しないでください。
- リスト#TRIG_LISTは、DEF_LISTコマンドでDEF_LIST NAME(#TRIG_LIST) TYPE(*WORKING) ENTRYS(2)として定義されていなければなりません。また、このリストでは、FIELDSパラメータに列を含むことができません。必要な列は自動的に追加されます。
- DISPLAY、REQUEST、またはPOP_UPコマンドは使用できません。これは、意図的に適用されている設計/使用上の制約で、将来的なバージョンで排除される可能性があります。
- 別のプロセス/ファンクションに対する呼び出し(CALL)が存在してはなりません。これは、意図的に適用されている設計/使用上の制約で、将来的なバージョンで排除される可能性があります。
- アクション・バー・プロセス内でトリガー・ファンクションを定義することはできません。これは、アクション・バー内からトリガー・ファンクションを参照できないということではなく、アクション・バー・タイプのプロセスの一部としてトリガー・ファンクションを定義できないということです。
- 関連付けられたプロセスではパラメータを使用できません。
- 交換リストは使えません。これは、トリガー・ファンクションの設計および使用における独立性とモジュール性を確保するために意図的に適用されている設計/使用上の制約です。
ファンクションをトリガー・ファンクションとして定義する場合、多くの状況で以下のガイドラインに従う必要があります。
- オプション*NOMESSAGESおよび*MLOPTIMIZEを使用してください。
- オプション*HEAVYUSAGEおよび*DBOPTIMIZEの使用を検討することもできます。
- 直接または間接を問わず、トリガーが関連付けられているデータベース・テーブル、または今後関連付けられるデータベース・ファイルにアクセスしないでください。
- トリガーが頻繁かつ継続的に呼び出される場合は、リソースを大量に消費する操作は避けてください。このような操作を実行すると、関連付けられたテーブルへのアクセス速度が低下します。無理のない範囲で、トリガーによって別のトランザクションを「送信」して、イベントのソースが大幅に遅れないようにしてください。
- 再帰的なファンクション呼び出しを記述することは可能ですが、実行の段階で失敗します。例えば、テーブルAへの挿入中に呼び出されたフィールド・トリガー・ファンクションがテーブルBにデータを挿入しようとすると、それ自体が再帰的に呼び出される状況に陥り、失敗する可能性があります。