トリガの定義ファイル

トリガの定義ファイルは、テキストファイルで、新しいトリガを追加したり、既存のトリガの変更したり、トリガを廃止し撤去したりできあます。トリガの定義ファイルは、1つ以上のトリガの定義から成ります。トリガの定義は、次の情報が含まれます:

自動的に生成されるトリガ名は、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]}

-triggername|-trigger-name-prefix*|-*

-triggername は、データベースから triggername というユーザ指定のトリガー名を削除します。 -triggername* は、開始名が triggername と一致するユーザー定義のトリガをすべて削除します。 -* は、すべてのトリガーを削除します。 MUPIP TRIGGERコマンドで -NOPROMPT が指定されていない場合、GT.Mは警告を表示し、すべてのトリガーを削除する前にユーザーの確認を求めます。MUPIP TRIGGER コマンドで -NOPROMPT が指定され、定義ファイルに -* 行が含まれる場合、GT.Mはユーザーの確認なしにすべてのトリガを削除します。$ZTRIGGER() は 削除の -NOPROMPTを実行します。 +triggername はエラーを発行します; 新しいユーザ指定のトリガ名を追加するには、-name=strlit2 を使用します。

{+|-}trigvn

trigvn は、トリガを設定するグローバルノードです。-trigvn は、指定されたトリガと一致するデータベース内のトリガーをすべて削除します。 +trigvn は、指定されたトリガーを追加または置き換えます。指定されたトリガが(一致する仕様で)存在する場合、MUPIP TRIGGER または $ZTRIGGER() は一致する定義をノーオペレーション(no-op)として扱い、結果としてデータベースは更新されません。同じトリガ・コードに複数のグローバル・ノードを指定する場合は、次の規則が適用されます:

  1. 添字のパターンと範囲を使用できます。

  2. 添字をセミコロン( ; )で区切られたリストで指定できます。

  3. ポイント、範囲、パターンの組み合わせを含む選択リストを指定できますが、パターンは終端と範囲のどちらも機能しません。たとえば、 :,"a":"d";?1U は有効な指定ですが、 :,"a":?1A は有効ではありません。

  4. 添字ごとにローカル変数名を指定できます。たとえば、 ^X(1,:,:) の代わりに、 ^X(1,lastname=:,firstname=:) を指定することができます。これにより、GT.Mはローカル変数 lastname と firstname を、このトリガーを呼び出すグローバル・ノードからそれぞれ実際の第2レベルと第3レベルの添字に定義します。トリガ・コードは、他のMローカル変数と同様にこれらの変数を使用できます。「トリガー実行環境」セクションで説明したように、トリガ・コードはクリーンな環境で実行されます。あたかも、すべてのコードの前に暗黙のNEWがあるかのように、暗黙的な割り当ては、トリガ・コードの範囲内でのみ適用され、実行時コードや他のトリガと競合したり影響を与えたりしません。

  5. @演算子 、不特定の添字(たとえば、 ^A()^A(:,) )またはローカル変数またはグローバル変数名を添字として使用することはできません。

  6. グローバル変数名にはパターンと範囲を使用できません。したがって、 ^Acct* に対して1つのトリガを設定することはできません。

非標準の照合を説明するために、GT.Mは、アプリケーション・アップデートが最初にトリガを起動したときに、グローバルな特定の照合を使用して文字列の添字の範囲を評価します。その結果、MUPIP TRIGGER や $ZTRIGGER() ではなく実行時に範囲の問題を検出し報告するので、適切にテストしてください。たとえば、GT.Mは、 (ASCII) C:A のような逆方向添字範囲の実行時エラーを報告します。

-command=cmd

cmd はトリガ呼び出しコマンドです。現在、S[ET], K[ILL], ZTR[IGGER], ZK[ILL] の1つ以上を指定できます。後続のGT.Mのリリースは、KILL された祖先の子孫ノードでトリガするために ZTK[ILL]をサポートすることがありますが、現在のバージョンではZTKを受け入れますが、Kに変換します。cmd が複数のコマンド値を指定する場合、GT.Mは、各Mコマンドを個別のトリガとして扱います。SET と KILLの両方を指定しても、常に1つのMコマンドだけが一致することに注意してください。トリガ・コードは、次の条件では実行されません:

  • 存在しないノードのKILL

  • cmd=ZK トリガを持つが、cmd=Kトリガを持たないノードのKILL

  • 子孫を持ち、データがなく、cmd=ZK のトリガを持つノードのZKILLまたはZWITHDRAW

  • トリガは「ピース"piece" 」シンタックス(後述)を使用し、更新で「ピース"piece" 」の変更をトリガーしません。

-xecute="|<<strlit1"|>>

strlit1 は、更新が trigvn と一致したときに実行されるトリガ・コードを指定します。strlit1 が単一行の場合は、引用符( ")で囲み、通常のMシンタックスのように strlit1 内の引用符が二重になっていることを確認してください。

strlit1 が複数の行にある場合は、先頭に<<を付けるか、-xecute の直後に = を付ける必要があります。<< の直後に改行を付ける必要があります。>> は、複数行の strlit1 の終わりをマークし、行の先頭になければなりません。strlit1 の行は、GT.Mプログラムの標準的な規則、つまりオプションのラベル、行の開始、およびMコードに従います。

strlit1 の最大長(複数行であっても)は、1048576(ASCII)文字または4096個のDBレコードのいずれか小さい方です。

strlit1 を検証するために、トリガ定義をデータベースに適用する前に MUPIP TRIGGERまたは$ ZTRIGGER() をコンパイルし、無効なコードが含まれているとTRGCOMPFAILエラーを発行します。

[注意] 注意

トリガ・コンパイルはコンパイル・エラーを検出しますが、ランタイム・エラーは検出しません。したがって、トリガ定義をデータベースに適用する前に、常にトリガ・コードをテストする必要があります。

注意 Warning : 警告

「トリガー定義ファイル」セクションで説明したように、トリガ・コードのテキストはトリガ・シグニチャーの一部です。同じセマンティクス(グローバル変数、添字、値、コマンド)を持つが、テキストが異なる(たとえば:set foo=$ztoldval , s foo=$ztoldval , set foo=$ztol )2つのトリガ・シグネチャを使用する場合、それらシグネチャは異なり、GT.Mはそれらを異なるトリガとして扱います。FISでは、トリガ・コードの包括的で強力なコーディング規則を使用するか、トリガの削除と置換を管理する際に、ユーザーが指定した名前に頼ることを推奨します。

例:

+^multi -commands=set -name=example -xecute=<<
 do ^test1
 do stop^test2
>>

[-pieces=int1[:int2][;...]]

cmd S[et] の場合、オプションのpiece(部分文字列)リスト・シーケンスを指定できます。ここで、 int2>int1int1:int2int1 から int2までの整数範囲を表します。トリガは、指定したpiece(部分文字列)リストのpiece(部分文字列)が変更された場合にのみ実行されます。trigvn に "Window|Chair|Table|Door" というリストがあり、次のトリガ定義を指定できるように、3番目または4番目の値が変更されたときにのみトリガを実行したいとします:

+^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.

このトリガは、最初の要素を変更した場合は実行されません。例:

S $Piece(^trigvn,"|",1)="Chandelier"

トリガを起動しません。

piece(部分文字列) シーケンスの範囲を指定することもできます。たとえば、3:5;7;9:11 では、3〜5,7と9〜11のトリガが指定されます。GT.Mは、重複する値または範囲をマージします。たとえば、3:6;7は 3:7 と同じです。

[-[z]delim=expr]

cmd S[ET] の場合は、-[z]delim=expr を使ってpiece(部分文字列)デリミタを指定することができます。ここで、expr は、文字列リテラルまたはノードの値でpiece(部分文字)を区切る文字列(たとえば "|")を評価する式(非常に限定的なシンタックスを持つ)で、環境変数 gtm_chset に基づいてASCIIまたはUTF-8文字列として解釈されます。MUPIP TRIGGERは、区切り文字式で表示が不能な区切り文字を使用できるようにするため、$CHAR() と $ZCHAR() と文字列連結(_)のみを文字列リテラルの修飾として受け入れます。zdelim で区切り文字が指定されている場合、GT.M は、$ZPIECE() に相当するものを使用して部分を照合し、$ZTUPDATE() の変更を識別します(詳細はISVの説明を参照してください)。 それ以外の場合、delim が区切り文字を指定すると、GT.Mは、現在のモード(MまたはUTF-8)に$PIECE() に相当するものを使用します。S[ET] 以外の cmd の区切り文字を指定するか、同じトリガーに対して delimzdelimの両方を指定するとそれぞれエラーが発生します。

[-options= {no]i[solation]|[[no]c[onsistencycheck]}...

トリガされたデータベース更新のプロパティとして [NO] ISOLATION または [NO]CONSISTENCYCHECKを指定できます。NOISOLATION は、アプリケーション・ロジックおよびデータベース・スキーマが ISOLATION のACIDプロパティを保証する責任を負うGT.Mに指示する機能であり、明らかな衝突は、競合チェックにおけるGT.Mレベルの粒度として働く同一の物理ブロック内に常駐する複数のグローバル・ノードから完全に同時発生します。現行リリースでは、このトリガ指定は表記のみです。VIEWコマンドを使用してプロセス・レベルでNOISOLATION を実装する必要がありますが、計画的にトリガ指定を使用してこの機能のスキーマ・ベース制御に移動できます。NOCONSISTENCYCHECK は、アプリケーションがGT.Mに指示して、アプリケーション・ロジックとスキーマが CONSISTENCYのACIDプロパティを保証する責任を負う機能です。 [NO]CONSISTENCYCHECK 機能はまだ実装されておらず、将来のGT.Mリリースで利用できるようになります。今のところ、アプリケーションからトリガへの CONSISTENCY の責任を移し、この機能が利用可能になったときに実装する予定です。 注: -options はトリガ・シグニチャーの一部ではないため、既存のトリガーを削除せずに変更することができます。

[-name=strlit2]

strlit2 はユーザー指定のトリガ名です。ユーザ指定のトリガ名は、最大28文字の英数字の文字列です。アルファベット文字またはパーセント記号(%)で始まる必要があります。注: -name は、トリガ・シグニチャの一部ではないため、既存のトリガを削除せずに変更することができます。また、名前を使用してトリガーを削除することもできます - この代替方法では、バリエーションがセマンティクスの意味を持たない場合に、 トリガ・シグネチャの一部である -xecute 修飾子に関連付けられたコード内のテキストのバリエーションに関する潜在的な問題を回避します。

inserted by FC2 system