Adabas トリガとストアドプロシージャ機能は、トリガやストアドプロシージャを定義、処理、および監視するときに使用します。
このドキュメントでは、両方のタイプのプロシージャおよびそれらの特性について説明します。 この機能のコンポーネントについて紹介し、オンラインサービスやバックグラウンド処理を提供するためにコンポーネントを組み合わせて使用する方法について説明します。
このドキュメントでは、次のトピックについて説明します。
プロシージャは、Natural の標準機能を使用して記述され、テストされた Natural サブプログラムです。 トリガとストアドプロシージャの主な違いは、その実行方法にあります。
トリガは、指定されたイベント(通常は関連テーブルに対するデータアクセスや更新)が発生すると、自動的に実行(起動)されます。 イベントは、選択条件が満たされると発生します。 選択条件には、ファイル番号の他、コマンドタイプ、フォーマットバッファ内に存在するフィールドの名前、またはそれら両方が含まれることがあります。
ストアドプロシージャは、データベース管理システム(つまり Adabas)が特殊なユーザーコールを受け取ると実行されます。
トリガであるか、ストアドプロシージャであるかにかかわらず、同じパラメータがサブプログラムに渡されます。
ストアドプロシージャはユーザーアプリケーションから呼び出されて、特殊なコールをプロシージャに発行します。1 つ以上のパラメータをプロシージャに渡すこともあります。 プロシージャは、Adabas によって実行されます。
プロシージャはデータベース(サーバー)にロードされる Natural システムファイル(Adabas ファイル)に格納されるため、サーバーとの間に発生するデータトラフィックの量が減少します。
ストアドプロシージャのサブプログラムがサンプルとして用意されています。ストアドプロシージャのフロントエンドで定義済みのコール構造は修正できます。
次の図は、ストアドプロシージャの使用法を示しています。 STPLNK は、 ストアドプロシージャ要求の呼び出しに使用されるストアドプロシージャのリンクルーチンです。 STPRBE は、 プロシージャから呼び出されるレコードバッファ抽出ルーチンのことで、コール元のルーチンから渡されるパラメータの取得に使用されます。
STPLNK の詳細は、「ストアドプロシージャのリンクルーチン(STPLNKnn)」を参照してください。 STPRBE のプログラミングに関する情報は、「レコードバッファ抽出ルーチン(STPRBE)」を参照してください。
トリガは、トリガするイベントと、トリガされるプロシージャの 2 つの部分から成ります。
トリガするイベントは、Adabas ファイル番号、オプションのコマンドまたはフィールド名(あるいはそれら両方)など一連の選択条件で定義されます。 条件が満たされると、イベントが発生し、それに応じてトリガされるプロシージャが実行されます。 例えば、EMPLOYEES ファイルの SALARY フィールドに対する更新コマンドによって、トリガが起動します。
注意:
トリガを別のトリガで起動させることはできません。
トリガの実行は、開始 Adabas コマンドが Adabas ニュークリアスによって実行される前にするか後にするかを定義できます。 トリガの動作は、トリガと Adabas コマンドが同期しているかどうか、同期しているならばトリガがコマンドのトランザクションロジックに関与しているかどうかによって一部変化します。
トリガは、開始 Adabas コマンドの前または後に実行できます。
トリガは、Adabas コマンドとは無関係に実行することも、Adabas コマンド処理の中断を必要とする(つまり、トリガされたプロシージャの結果が出るまでコマンド処理を待機させる)こともできます。
同期トリガは、ユーザーのトランザクション(つまり ET)ロジックに関与することも関与しないことも可能です。
プレコマンド(または "プレ")トリガは、Adabas ニュークリアスによる開始 Adabas コマンドの処理前に実行されます。 Adabas コマンドの実行前にチェックが行われ、トリガを起動すべきかどうかが確認されます。
例えば、指定されたファイルに対して N1 コマンドが発行されるたびにトリガが起動するように定義されている場合、N1 は開始 Adabas コマンドです。 N1 の実行前に行われるチェックで、プレコマンドトリガを起動するかどうかが決定されます。 トリガされたプロシージャが正常に実行された後で、N1 が処理されます。
ポストコマンド(または "ポスト")トリガは、Adabas ニュークリアスによる開始 Adabas コマンドの処理後に実行されます。 トリガされたプロシージャは、Adabas ニュークリアスからのコマンドのリターンコードがゼロの場合にのみ実行されます。 リターンコードがゼロ以外の場合は、トリガがあるかどうかはチェックされず、処理は通常どおりに継続します。 正常に実行されたコマンドについては、コマンドの処理の完了前に、トリガがあるかどうかがチェックされます。
例えば、指定されたファイルに対して L3 コマンドが発行されるたびにトリガが起動するように定義されている場合、L3 は開始 Adabas コマンドです。 ゼロのリターンコードが返された後に行われるチェックで、ポストコマンドトリガを起動するかどうかが決定されます。 コマンドが正常に実行されてからユーザーに通知される前に、トリガされたプロシージャが実行されます。
非同期トリガは、Adabas コマンドの開始とは無関係に実行されます。 ユーザーに対する Adabas コマンドの処理は、トリガされたプロシージャが別の処理として実行される間に、中断されずに続行されます。 トリガされたプロシージャが実行されるのは、開始するコマンドからの応答を受信した後です。
トリガ条件を満たすコマンドが発行されると、トリガが起動され、Adabas コマンドの処理が再開されます。 Adabas コマンドとトリガされるプロシージャが、お互いに直接影響し合いません。
非同期トリガは、プロシージャと実際の Adabas コマンドの間に依存関係がないときに使用されます。
同期トリガでは、該当ユーザーの Adabas コマンド処理が中断されます。 開始 Adabas コマンドは、トリガされたプロシージャの実行が完了するまで中断されます。 プロシージャの結果が Adabas コマンドに影響する可能性があります。
ポストコマンドトリガの場合、トリガされるプロシージャの前に Adabas コマンドが実行された後中断します。コマンドの結果は、トリガされたプロシージャの実行が完了するまでユーザーに返されません。
同期トリガは、開始 Adabas コマンドのロジックに関与する場合も関与しない場合もあります。
関与トリガが起動すると、関与トリガを起動した Adabas コマンドと同じユーザー(コミュニケーション)ID が割り当てられているプロシージャが実行されます。したがって、このトリガはトランザクションのロジックに全面的に関与することになります。
開始コマンドの処理で発行された ET(エンドトランザクション)またはBT(バックアウトトランザクション)は、トリガから実行中のすべてのトランザクションに影響を与えます。
トリガされたプロシージャが発行した ET または BT は、開始コマンドで実行中のすべてのトランザクションに影響を与えます。
非関与トリガのユーザー ID は、開始コマンドを識別する Adabas ユーザーキューエレメント(UQE)のユーザー(コミュニケーション)ID とは異なります。したがって、このトリガは、開始コマンドのトランザクションロジックには関与しません。
開始コマンドのプロセスで発行された ET または BT は、トリガされるプロシージャに影響を与えません。
トリガされるプロシージャで発行された ET または BT は、開始コマンドのプロセスに影響を与えません。
Adabas では、トリガとストアドプロシージャを実装および処理するために、3 つの主要なコンポーネントを使用します。
Adabas トリガドライバは、Adabas ニュークリアスの一部であり、トリガとストアドプロシージャを全般的に制御します。 プロシージャの要求を検出すると、Natural トリガドライバを初期化して要求を実行します。
Natural トリガドライバは、実際にはトリガとストアドプロシージャの両方を実行するバッチ Natural ニュークリアスとして実行されます。 Adabas トリガドライバとともに動作して、Adabas ニュークリアスと、プロシージャを実行する Natural サブシステムとの処理間コミュニケーションを管理します。
トリガメンテナンスは、Natural アプリケーションで、 Adabas Online System(AOS)から実行できます。 体系化されたメニューを使用して、トリガ定義の作成と管理、トリガのプロファイルの定義、ニュークリアスにおけるトリガのアクティビティの監視と一部の制御を行うことができます。
Adabas トリガドライバは、Adabas ニュークリアスの一部として実行され、一般にトリガの実行時処理全体を制御します。 トリガを起動するかどうか、Natural トリガドライバを開始するかどうか、および相互に作用するかどうかを判断して、プロシージャが正確に適切な時間の範囲で処理するようにします。 プロシージャの処理方法の詳細は、「処理とパフォーマンス」を参照してください。
Adabas ニュークリアスは、起動時に ADARUN パラメータ SPT=YES が指定されているかどうかを判断します。指定されている場合は、制御が Adabas トリガドライバに渡され、Adabas トリガドライバを初期化できるようになります。 初期化時に、Adabas トリガドライバは次の処理を行います。
バッファ用にストレージを確保します。
トリガファイル上の トリガプロファイルを確認し、セッションのトリガとストアドプロシージャの処理時に使用されるセッションパラメータを抽出します。
トリガ定義を読み込み、エントリを トリガテーブルに追加します。トリガテーブルは、メモリ上のバッファに格納されます。 ニュークリアスクラスタ環境では、アクティブなニュークリアスからトリガテーブルが取得されます。 プロシージャの処理時は、 トリガテーブルでトリガが存在することを確認できるため、トリガファイルを読み込むという効率の悪い方法を使用する必要はありません。
Adabas トリガドライバが開始されると、プロシージャを実際に実行する Natural サブシステムが開始されます。
Natural サブシステムは、ユーザー作成のプロシージャを実行します。 Adabas トリガプロファイルの最大サブシステムパラメータでは、 開始する Natural サブシステムの数(1~10)を指定します。
各 Natural サブシステムは、通常、Adabas アドレススペース内のサブタスクとして実行するように最低限修正されたバッチ Natural ニュークリアスです。 これは、MPM 起動 JCL/JCS で指定されるリージョンサイズに影響します。 この影響は分割された Natural ニュークリアスを使用することで、最小化することができます。
Natural サブシステムが開始されると、Adabas トリガドライバは、サブシステムのステータスやアクティビティの変化を記録します。 ユーザーは、トリガメンテナンスのサブシステムアクティビティ機能を使用して、これらのアクティビティを監視できます。
Natural サブシステムがアクティブになると、次の処理が行われます。
Natural トリガドライバが制御を取得します。
Adabas トリガドライバは、ストアドプロシージャ要求またはトリガの起動により発生する可能性があるプロシージャの処理をサブシステムが実行可能な状態であることが通知されます。
Adabas トリガドライバは、ニュークリアスが受け取るコマンドごとに、トリガを起動する必要があるかどうかを決定します。
プレコマンドトリガの場合、Adabas トリガドライバは Adabas スレッドで処理されるコマンドが選択される前にトリガをチェックします。 Adabas でコマンドが正常に処理されレスポンスコードがゼロになると、Adabas トリガドライバは起動するポストコマンドトリガがあるかどうか調べます。 1 つのコマンドに対して起動できるのは、結果に関係なく 2 つのトリガ(1 つのプレコマンドトリガと 1 つのポストコマンドトリガ)のみです。
コマンドの結果がトリガの起動である場合、またはコマンドがストアドプロシージャ要求であると Adabas トリガドライバが判断した場合、次の場所でエントリが作成されます。
エントリには、コマンドと、トリガテーブル内の対応するエントリの両方から取得した情報が含まれます。
Natural サブシステムが処理を待機中の場合、 直ちにトリガ要求が渡されます。 それ以外の場合、次のサブシステムが使用可能になるまで、トリガ要求はプレトリガキューまたはポストトリガキュー内に残ります。 サブシステムがトリガ要求を受け入れると、 Natural トリガドライバの制御下で処理が続行されます(「コンポーネント」を参照)。
プロシージャの実行が完了すると、Natural トリガドライバは、その結果を "トリガ要求エントリ" に格納し、ステータスが適切に更新されます。 Adabas トリガドライバは、この処理を検出すると、トリガ処理を完了しようとします。
プレコマンドトリガとポストコマンドトリガのどちらでも、プロシージャからのリターンコードによって、結果の処理方法が決定されます。 詳細については、「結果の処理」を参照してください。
Adabas トリガドライバは、 失敗した Natural サブシステムのすべてを記録します。 すべてのサブシステムが失敗すると、Adabas トリガドライバは、プロシージャをこれ以上処理することができないと判断し、Adabas トリガプロファイルのエラーアクション値に従って終了します。 ニュークリアスクラスタ環境では、 クラスタ内の他の全ニュークリアスにエラーアクション Ignore または Reject が渡されます。
Adabas ニュークリアスが ADAEND または HALT オペレータコマンドを受け取り、Adabas トリガドライバにシャットダウンを指示した場合は、Adabas トリガドライバも終了します。
Natural トリガドライバは、Natural サブシステムの起動時に初期化されます。 Natural トリガドライバは、トリガされたプロシージャとストアドプロシージャのすべてを実行します。次のコンポーネントがあります。
トリガ要求が Natural サブシステムによって受け入れられると、STPPDRIV は、起動されたトリガによって指定されたパラメータリストに応じて、プロシージャに渡すパラメータリストを設定します。
Adabas トリガプロファイルでトリガアクティビティの記録設定がアクティブな場合、ルーチン STPUTRAK が呼び出されます。
STPUTRAK は、ユーザー定義のルーチンで、プロシージャを呼び出す各要求を記録します。この記録は、プロシージャを呼び出す前と後の両方で行われます。 このルーチンを使用して、トレースメッセージの書き込みと、各サブシステムのトリガ処理の監査を行うことができます。 デフォルトの STPUTRAK ルーチンが用意されています。
プロシージャのパラメータと同類で、トリガに関する情報を含むパラメータが、ワークエリアとして使用可能な 250 バイト領域とともに STPUTRAK ルーチンに渡されます。 STPUTRAK は、このワークエリアを使用して、セッション全体の情報を保持します。ワークエリアは Natural トリガドライバによって変更されることはありません。 STPUTRAK には、ワークエリアをプロシージャに渡すことができるオプションが用意されています。
STPUTRAK が処理されて制御が STPPDRIV に戻ると、トリガされたプロシージャが CALLNAT を使用して呼び出されます。
プロシージャが処理を完了すると、STPPDRIV は結果の STPNAT を通知する前に、Adabas トリガプロファイルで "トリガアクティビティの記録" オプション がアクティブに設定されているかどうかを再度確認します。 アクティビティの記録がアクティブな場合、プロシージャの結果を監査できるように STPUTRAK が呼び出されます。
プロシージャが NAT0954、NAT3009、NAT1305 などのエラーになると、プロシージャは正常に終了しません。 代わりに Natural トリガドライバはエラーリカバリを実行します。
トリガアクティビティの記録設定に関係なく、エラーの情報は STPUTRAK に渡されます。 この情報は、データベース管理者(DBA)がデバッグや問題分析に使用できます。 そのため、STPUTRAK は Natural トリガドライバによって常に実行可能でなければなりません。 この情報を取得するためにトレースをアクティブ化することをお勧めします。
プロシージャの結果が STPNAT に渡されると、トリガ要求が更新され、そのステータスは "完了" に変化します。 Adabas トリガドライバは、更新されたエントリを検出するとトリガ処理を完了します。
STPNAT は別のトリガ要求が作成されるのを待機し、サイクル全体が再び開始します。
トリガメンテナンスは、 トリガ定義の作成とシステム処理の監視を対話的に実行する機能で、フルバージョンの Adabas Online System が必要です。 詳細は、このドキュメントの「トリガメンテナンス」を参照してください。
trigger definitionは、実行対象のプロシージャの名前と属性、および triggering eventを起動する選択条件(Adabas コマンドタイプ、ファイルの名前または番号、およびフィールド名)で構成されます。
トリガメンテナンスでは、ニュークリアスによるあらゆるトリガ処理の実行を監視および制御する機能も提供します。 Adabas トリガドライバと Natural トリガドライバの両方のアクティビティを調べて、次の処理を実行できます。
ニュークリアスにおけるトリガ環境の状態を判断します。つまり、アクティブなトリガとそうでないトリガ、バッファサイズ、および Natural サブシステムのステータスを判断します。
アクティブなセッション中に、アクティビティのタイムアウト、トリガアクティビティの記録、エラーアクションなど、さまざまなパラメータの設定を修正します。
プレトリガキューおよびポストトリガキューを調べます。これらのトリガキューには、起動されたプレコマンドトリガおよびポストコマンドトリガの実行を待機するプロシージャが格納されています。
Adabas トリガおよびストアドプロシージャ機能のアクティビティを調べ、何が実行されているのか、問題が存在するかどうか、現在アクティブな Natural サブシステムの数などを判断します。
新規、削除、または更新されたトリガ定義で Adabas ニュークリアスのトリガテーブルをリフレッシュします。
トリガを個々にアクティブ化または非アクティブ化します。 特定のトリガで問題が見つかった場合は、問題を解決する一方で、トリガを一時的または永続的に非アクティブ化することができます。
ストアドプロシージャ処理のステップについて、次の図に示し、「処理ステップ」で説明します。
処理ステップ
ユーザーアプリケーションは、必要なパラメータを設定し、ストアドプロシージャのリンクルーチン STPLNKnn に対して CALL を発行します。
STPLNKnn は、ユーザーの要求を解釈し、標準の Adabas API の形式で DBMS に対する呼び出しを発行します(直接呼び出し)。
Adabas トリガドライバはストアドプロシージャ要求を受け取り、Natural トリガドライバに渡します。
指定された Natural サブプログラム(ストアドプロシージャ)が呼び出されます。
必要に応じて、呼び出し元のパラメータが、レコードバッファ抽出ルーチンによってサブプログラムで利用できるようになります。 オプション設定で許可されている場合は、パラメータを修正できます。
完了すると、Natural サブプログラムは制御を Natural トリガドライバに返します。
Natural トリガドライバは、ストアドプロシージャ要求の結果を Adabas トリガドライバに返します。
ユーザーに、通知と修正されたパラメータが返されます。
トリガ処理のステップについて、次の図に示し、「処理ステップ」で説明します。
処理ステップ
Adabas トリガドライバは、すべての Adabas コマンドを受け取り、それらのコマンドがトリガイベントに該当するか確認します。
コマンドがトリガ条件を満たすと、Adabas トリガドライバはトリガ要求と処理間情報をトリガテーブルに格納します。
Natural トリガドライバ制御ルーチン STPPDRIV で別のトリガ要求を処理する準備が整うと、STPPDRIV は STPNAT を呼び出します。
STPNAT は、トリガテーブルから次のトリガ要求を取得し、STPPDRIV に渡します。
STPPDRIV は、トリガ要求タイプを判断し、CALLNAT をトリガ定義で指定された Natural サブプログラムに対して発行し、関連するパラメータを渡します。
STPNAT は、トリガテーブル内のトリガエントリを更新し、トリガが完了したことを示します。