トリガの定義ファイルは、テキストファイルで、新しいトリガを追加したり、既存のトリガの変更したり、トリガを廃止し撤去したりできあます。トリガの定義ファイルは、1つ以上のトリガの定義から成ります。トリガの定義は、次の情報が含まれます:
トリガ・シグネチャー:トリガ・シグネチャは、グローバル変数、添字、値、コマンド、トリガ・コードで構成されます。GT.Mは、グローバル変数、添字、値、コマンドの組み合わせを使用して、データベースの更新を呼び出すために一致するトリガを検索します。
グローバル変数:このトリガが適用される特定のグローバルの名前。
添字:名前付きグローバルのグローバル変数ノードの添字、ZWRITEコマンドと同じパターンを使用して指定します。
値(Value):ノードで値をSETまたは更新するコマンドの場合、GT.Mは値の区切られた部分の変更を画面に表示するオプションのパターンに従います。値のパターンには、部分文字の抽出と関心文字列の部分文字のリストが含まれます。
コマンド:SET、KILL、ZTRIGGER、ZKILLの4つのコマンドがあります(ZWITHDRAWはZKILLと同じです)。トリガを指定するときに、コマンドの短縮名が使用されます。MERGEは、論理的には、ループ内で実行される一連のSET操作と同等に扱われます。GT.Mは、SETトリガ定義と一致するグローバルの$INCREMENT() をトリガ更新として扱います。
トリガコード:アプリケーションコードが更新されたときにGT.Mが実行するMコードを含む文字列。KILLなどのコマンドによる削除、一致するトリガを持つグローバル・ノードなどが含まれます。指定されたコードは、追加のルーチンとサブルーチンを呼び出すことができます。
注意 | |
---|---|
GT.MはトリガコードのI / O操作の実行を制限しませんが、FISは、トリガ・アプリケーション・コード内でOPEN、USE、READ、WRITE、CLOSEを使用することを推奨しています。このような操作は、開発および診断の目的に役立つ可能性があります。ただし、トリガはTPトランザクションとして暗黙的に実行され、I / OはACIDプロパティーの分離に違反します。さらに、MUPIPはメインのGT.Mランタイムとは多少異なるI / O処理特性を持っているため、MUPIPが実行するトリガー内のI / Oはオリジナルのアプリケーション環境とは異なる動作をする可能性があります。 |
トリガされたデータベース更新のためのACIDプロパティ修飾子:現在のところ、GT.Mはトリガ定義のこの部分に対してシンタックス・チェックを単に実行するだけです。GT.Mは、トリガ・データベースの更新、およびトランザクション・セマンティクスで実行されるトリガ・ロジックによって生成された更新を確実にします。VIEW "NOISOLATION" コマンドを使用すると、GT.Mトランザクション処理は、アプリケーションがGT.Mランタイムシステムにアイソレーションを強制する必要がないことを通知するメカニズムを提供しています。このような場合、アプリケーションとスキーマの設計では、$JOBを添字として使用して、ある特定のグローバルでノードを更新するプロセスが1つしかないことを保証することによって分離を提供します。このプロパティーは、VIEWコマンドのプロセス使用とは対照的に、トリガ指定が特定のノードに対してNOISOLATIONをグローバル全体とは対照的に、そのノードへのすべての更新に対してNOISOLATIONを提供できる時間を予測します。現在、GT.Mランタイム・システムは、トランザクション内のアプリケーション・ロジックとトリガされた更新に対して一貫性を強制します。このプロパティは、トリガ仕様によってアプリケーションがランタイムシステムにアプリケーションとスキーマ設計を通知し、トリガとそのロジックに対して適切な一貫性を保証し、GT.Mランタイムシステムをそのタスクから解放することを可能にする時間を予期します。
トリガ名:オプションで、各トリガを一意に識別するトリガー名を指定することができます。GT.Mはエラー報告やトリガの設定の管理にトリガ名を使用します。たとえば、ZSHOW "S" はスタック上の各トリガの名前を報告します。トリガ名を指定しないと、ベースとしてグローバル名を使って1つを自動的に生成されます。ユーザ指定のトリガー名と自動的に生成されるトリガ名は、異なる名前空間を占めます; どちらも定義の生存期間中に存続します。ユーザ指定のトリガ名は、最大28文字の英数字の文字列です。アルファベット文字またはパーセント記号(%)で始まる必要があります。トリガ名の場合、GT.MはM言語の名前と同じ命名規則を使用します。他の文脈では、GT.Mは31文字でM言語の名前を切り捨てます。ただし、GT.Mは28文字以上のトリガ名をエラーとして扱います。これは、トリガ名がトリガを一意的に識別し、切り捨てが重複を引き起こす可能性があるためです。
自動的に生成されるトリガ名は、2つの部分で構成される文字列です。グローバル名をベースにして、GT.Mは最初の部分をアルファベット文字またはパーセント記号(%)で始まる最大21文字の英数字文字列として受け取ります。末尾部分は、#n# の形式で自動的にインクリメントされた番号で構成されます。ここで n は、同じ更新のトリガを一意に識別する1から999999まで単調に増加する整数です。たとえば、トリガ定義ファイルにトリガ名が指定されていない場合、GT.Mは、グローバル変数 ^Account に定義された最初の3つのトリガに対して、トリガ名 Account#1#, Account#2#, Account#3# を自動的に生成します。自動割り当てを100万回を超えるトリガに使用しようとすると、エラーが発生します。自動生成された名前の数値部分が 999999 に達すると、自動生成された名前空間を使用するグローバル変数に関連付けられたすべてのトリガーを再ロードする必要があります。実行時にGT.Mは、環境が複雑な場合でも、すべてのトリガに一意の指定があることを保証するために、ハッシュ記号(#)の末尾に #を続けて2文字まで続く接尾辞を生成します。ランタイム・サフィックスは、ユーザー指定のトリガ名と自動的に生成されるトリガ名の両方に適用されます。異なるデータベース・ファイルで同じ名前のトリガを区別するのに役立ちます。
ルーチン ^OpenAccount
を呼び出すために、すべての s ^Acct("ID")
に TrigAcct
というトリガを設定したいとします。トリガ定義ファイルは、 +^Acct("ID") -command=S -xecute="do ^OpenAccount" -name=TrigAcct
のようなエントリを持つかもしれません。次の図は、このトリガー定義のさまざまな部分を示しています:
このトリガ定義ファイルをGT.Mに適用するには、MUPIP TRIGGER -TRIGGERFILE または $ZTRIGGER() を使用してロードするだけです。GT.Mは ^Acct("ID")
のすべてのSET操作でトリガ名 TrigAcct
を呼び出します。Internally, GT.M stores trigger TrigAcct
in the same database file where ^Acct
is stored.
内部的には、GT.Mはトリガ TrigAcct
を ^Acct
が格納されているのと同じデータベース・ファイルに格納します。トリガ定義ファイル内の項目のシンタックスは次のとおりです:
{-triggername|-triggername-prefix*|-*|{+|-}trigvn -commands=
cmd[,...]
-xecute=strlit1
[-[z]delim=expr
][-pieces=[lvn=]int1[:int2][;...]
] [-options={[no]i[solation]|[no]c[onsistencycheck]}...] [-name=strlit2
]}
|
|
||||||
|
非標準の照合を説明するために、GT.Mは、アプリケーション・アップデートが最初にトリガを起動したときに、グローバルな特定の照合を使用して文字列の添字の範囲を評価します。その結果、MUPIP TRIGGER や $ZTRIGGER() ではなく実行時に範囲の問題を検出し報告するので、適切にテストしてください。たとえば、GT.Mは、 (ASCII) C:A のような逆方向添字範囲の実行時エラーを報告します。 |
||||||
- |
|
||||||
|
strlit1 は、更新が trigvn と一致したときに実行されるトリガ・コードを指定します。strlit1 が単一行の場合は、引用符( ")で囲み、通常のMシンタックスのように strlit1 内の引用符が二重になっていることを確認してください。 strlit1 が複数の行にある場合は、先頭に<<を付けるか、-xecute の直後に = を付ける必要があります。<< の直後に改行を付ける必要があります。>> は、複数行の strlit1 の終わりをマークし、行の先頭になければなりません。strlit1 の行は、GT.Mプログラムの標準的な規則、つまりオプションのラベル、行の開始、およびMコードに従います。 strlit1 の最大長(複数行であっても)は、1048576(ASCII)文字または4096個のDBレコードのいずれか小さい方です。 strlit1 を検証するために、トリガ定義をデータベースに適用する前に MUPIP TRIGGERまたは$ ZTRIGGER() をコンパイルし、無効なコードが含まれているとTRGCOMPFAILエラーを発行します。
例: +^multi -commands=set -name=example -xecute=<< do ^test1 do stop^test2 >> |
||||||
|
+^trigvn -commands=S -pieces=3;4 -delim="|" -options=NOI,NOC -xecute="W ""3rd or 4th element updated.""" GTM>W ^trigvnWindow|Chair|Table|Door| GTM>s $Piece(^trigvn,"|",3)="Dining Table" 3rd or 4th element updated. このトリガは、最初の要素を変更した場合は実行されません。例:
トリガを起動しません。 piece(部分文字列) シーケンスの範囲を指定することもできます。たとえば、3:5;7;9:11 では、3〜5,7と9〜11のトリガが指定されます。GT.Mは、重複する値または範囲をマージします。たとえば、3:6;7は 3:7 と同じです。 |
||||||
[-[z]delim=expr]
|
|
||||||
|
トリガされたデータベース更新のプロパティとして |
||||||
|
|