TRIGGERコマンドは、作成済のプログラムをオブジェクトに関連付け、プログラムを自動で実行するオブジェクト・イベントを識別したり、オブジェクトとトリガー・プログラムの関連付けを解除したりするコマンドです。
トリガー・プログラムをオブジェクトに割り当てるには、オブジェクトは最新の定義のもの、または現行のセッション中に検討されたものにする必要があります。そうでない場合は、最初にCONSIDER文を使用し、現行の定義にする必要があります。
構文
TRIGGER {event-name [program-name] }... | {DELETE event-name}... | DELETE ALL
ここで、event-nameは次のいずれかです。
1つのTRIGGER文には同じキーワードを何回でも使用できますが、この場合、Oracle OLAPは最後に使用したキーワード以外はすべて無視します。詳細は、「同じキーワードの複数回の記述」を参照してください。
パラメータ
プログラムのトリガーをMaintainイベントにすることを指定します。Maintainイベントとは、MAINTAIN文の実行のことです。表8-19「MAINTAINイベントのサブイベント」に概要を示すように、Maintainイベントには、MAINTAINコマンドの主要キーワードに対応する複数のサブイベントがあります。Maintainイベントによってトリガーされるプログラムが実行される正確なタイミングは、プログラムをトリガーするMaintainサブイベントと、Maintainイベントの定義の対象となるオブジェクト・タイプによって決まります。
ディメンションおよびコンポジットのMaintain AddイベントおよびMaintain Mergeイベントによってトリガーされるプログラムは、全体のMAINTAIN文が実行された後に実行されます。
ディメンション・サロゲートのMaintain AddイベントおよびMaintain Mergeイベントによってトリガーされるプログラムは複数回、つまりそれぞれの値が追加またはマージされた後に1回ずつ実行されます。
その他のMaintainサブイベントによってトリガーされるプログラムは、MAINTAIN文の実行前に実行されます。
プログラムのトリガーをDeleteイベントにすることを指定します。Deleteイベントとは、オブジェクトに対するDELETE文のことです。Oracle OLAPでは、DELETE文によってオブジェクトが削除される直前に、指定のプログラムが実行されます。
Oracle OLAPがPropertyイベントに応答して指定のプログラムを実行することを指定します。Propertyイベントとは、オブジェクト・プロパティの作成、変更または削除を目的とするPROPERTY文の実行のことです。Propertyイベントによってトリガーされたプログラムは、このプログラムをトリガーした文より先に実行されます。
Oracle OLAPがAssignイベントに応答して指定のプログラムを実行することを指定します。Assignイベントは、SETによって値が変数、リレーション、ワークシート・オブジェクトまたは計算式に代入されると実行されます。SETによってトリガーされるプログラムは、イベントが定義されたオブジェクトにOracle OLAPが値を代入するたびに実行されます。このため、Assignイベントでトリガーされるプログラムは通常、代入文がオブジェクトをループ処理して値を代入するときに繰り返し実行されます。
マルチライタ・モードでアタッチされているアナリティック・ワークスペースで、ACQUIREを使用してオブジェクトを取得した場合は、このオブジェクトの更新後、指定のプログラムがOracle OLAPによってただちに実行されることを指定します。
ヒント: アナリティック・ワークスペース全体を更新するときの処理を指定するには、TRIGGER_AFTER_UPDATEプログラムまたはTRIGGER_BEFORE_UPDATEプログラムを作成します。 |
トリガー・プログラムの名前。イベントに対してこの名前を省略した場合、そのイベントはアクションをトリガーしません。
指定したオブジェクト・イベントのトリガーを削除します。Oracle OLAPは、指定したオブジェクト・イベントとトリガー・プログラムとの関連付けを解除します。
指定したオブジェクトのトリガーをすべて削除します。Oracle OLAPは、オブジェクトのすべてのイベントとトリガー・プログラムとの関連付けを解除します。
使用上の注意
同じキーワードの複数回の記述
1つのTRIGGER文には、すべてのキーワードを使用できます。ただし、1つのTRIGGER文に同じキーワードを2回使用すると、最後に使用したキーワードのみが認識され、もう一方のキーワードは無視されます。
たとえば、次のTRIGGER文を記述した場合を考えます。
TRIGGER PROPERTY progname1 PROPERTY progname2 PROPERTY progname3
このTRIGGER文を実行すると、Oracle OLAPは、オブジェクトのプロパティが作成、変更または削除される直前にprogname3
を実行します。つまり、Oracle OLAPはprogname1
とprogname2
のいずれも実行しません。
例
例10-159 トリガーの作成
アナリティック・ワークスペースにcity
というTEXT
ディメンションが格納されており、city
に対してMAINTAIN文が実行されるか、cityのプロパティが作成または削除されると自動的に実行されるプログラムを作成するとします。これらのトリガーを作成するには、次の文を発行します。
"Define the trigger programs DEFINE trigger_maintain_move_city PROGRAM BOOLEAN DEFINE trigger_property_city PROGRAM BOOLEAN "Associate the trigger programs to events for the city dimension CONSIDER city TRIGGER PROPERTY trigger_property_city TRIGGER MAINTAIN trigger_maintain_move_city
例10-160 トリガーの説明
例10-159「トリガーの作成」で説明したように、city
に対してトリガーを作成した場合を考えます。後でトリガーの説明を参照するため、アナリティック・ワークスペースに対してDESCRIBE文を発行することはできません。そうではなく、FULLDSC文を発行する必要があります。
DEFINE CITY DIMENSION TEXT TRIGGER MAINTAIN TRIGGER_MAINTAIN_MOVE_CITY - PROPERTY TRIGGER_PROPERTY_CITY DEFINE TRIGGER_MAINTAIN_MOVE_CITY PROGRAM BOOLEAN DEFINE TRIGGER_PROPERTY_CITY PROGRAM BOOLEAN
例10-161 トリガーの削除
例10-159「トリガーの作成」で説明したトリガーを作成した場合を考えます。今度はcity
のMAINTAINトリガーを削除します。このトリガーを削除するには、次の文を発行します。
CONSIDER city TRIGGER DELETE MAINTAIN
FULLDSC文を発行したら、city
のMAINTAINトリガーは削除されているが、trigger_maintain_move_city
プログラムは残っていることを確認します。
DEFINE CITY DIMENSION TEXT TRIGGER PROPERTY TRIGGER_PROPERTY_CITY DEFINE TRIGGER_MAINTAIN_MOVE_CITY PROGRAM BOOLEAN DEFINE TRIGGER_PROPERTY_CITY PROGRAM BOOLEAN
trigger_maintain_move_city
プログラムを実際に削除するには、次の文を発行する必要があります。
DELETE TRIGGER_MAINTAIN_MOVE_CITY
例10-162 MAINTAINトリガー・プログラム
アナリティック・ワークスペースに、次のような定義を持つディメンションがあるとします。
DEFINE CITY DIMENSION TEXT
cityに対してMaintainトリガーを作成する手順は、次のとおりです。
トリガー・プログラムをユーザー定義ファンクションとして定義します。このプログラムには、名前を自由に付けることができます。次の文では、trigger_maintain_city
という名前のプログラムが定義されます。
DEFINE trigger_maintain_city PROGRAM BOOLEAN
プログラムの内容を指定します。
PROGRAM SHOW JOINCHARS ('calltype = ' CALLTYPE) SHOW JOINCHARS ('triggering event = ' TRIGGER(EVENT)) SHOW JOINCHARS ('triggering subevent = ' TRIGGER(SUBEVENT)) RETURN TRUE END
TRIGGER文を発行し、Maintainイベントが発生したら実行されるプログラムとして、トリガー・プログラムとcity
ディメンションを関連付けます。CONSIDER文を使用して、city
の定義を現行の定義にすることを忘れないでください。
CONSIDER city TRIGGER MAINTAIN TRIGGER_MAINTAIN_CITY
アナリティック・ワークスペースの完全な詳細を参照するためにFULLDSC文を発行すると、city
の定義(そのMaintainトリガーを含む)やtrigger_maintain_city
プログラムを参照できます。
DEFINE CITY DIMENSION TEXT TRIGGER MAINTAIN TRIGGER_MAINTAIN_CITY DEFINE TRIGGER_MAINTAIN_CITY PROGRAM BOOLEAN PROGRAM SHOW JOINCHARS ('calltype = ' CALLTYPE) SHOW JOINCHARS ('triggering event = ' TRIGGER(EVENT)) SHOW JOINCHARS ('triggering subevent = ' TRIGGER(SUBEVENT)) RETURN TRUE END
次の文および出力に示すように、cityに対してMAINTAIN文を発行すると、trigger_maintain_city
プログラムが実行されます。
MAINTAIN city ADD 'Boston' 'Houston' 'Dallas' calltype = TRIGGER triggering event = MAINTAIN triggering subevent = ADD REPORT city CITY -------------- Boston Houston Dallas MAINTAIN city MOVE 'Dallas' to 2 calltype = TRIGGER triggering event = MAINTAIN triggering subevent = MOVE REPORT city CITY -------------- Boston Dallas Houston
例10-163 変数のASSIGNトリガー
アナリティック・ワークスペースに次の定義を持つオブジェクトが格納されているとします。
DEFINE geog DIMENSION TEXT DEFINE sales VARIABLE DECIMAL <geog> DEFINE percent_sales VARIABLE INTEGER <geog>
sales
変数には、次の値が格納されています。
GEOG SALES -------------- ---------- North America 0.59 Europe 9.35 Asia NA
percent_sales
変数は空です。
値をpercent_sales
に代入したら、値に特殊な処理をするとします。この処理を自動化するには、次の手順に従って、percent_sales
のAssignトリガー・プログラムを作成します。
値をpercent_sales
に代入するたびに実行されるトリガー・プログラムを作成します。
DEFINE TRIGGER_EQ PROGRAM BOOLEAN PROGRAM ARGUMENT datavalue WORKSHEET show 'description of triggering object = ' FULLDESCRIBE &TRIGGER(NAME) SHOW JOINCHARS ('calltype = ' CALLTYPE) SHOW JOINCHARS ('triggering event = ' TRIGGER(EVENT)) SHOW JOINCHARS ('triggering subevent = ' TRIGGER(SUBEVENT)) SHOW JOINCHARS ('value being assigned = ' datavalue) SHOW ' ' END
TRIGGER文を使用して、Assignトリガーをpercent_sales
に追加します。最初にCONSIDER文を発行して、percent_sales
変数の定義を現行の定義にすることを忘れないでください。
CONSIDER percent_sales TRIGGER ASSIGN TRIGGER_EQ
値をpercent_sales
に代入します。
percent_sales = (sales/TOTAL(sales))*100
値をpercent_sales
に代入すると、trigger_eq
プログラムの実行がトリガーされ、次の出力行が生成されます。
description of triggering object = DEFINE PERCENT_SALES VARIABLE INTEGER <GEOG> TRIGGER ASSIGN TRIGGER_EQ calltype = TRIGGER triggering event = ASSIGN triggering subevent = value being assigned = 6 description of triggering object = DEFINE PERCENT_SALES VARIABLE INTEGER <GEOG> TRIGGER ASSIGN TRIGGER_EQ calltype = TRIGGER triggering event = ASSIGN triggering subevent = value being assigned = 94 description of triggering object = DEFINE PERCENT_SALES VARIABLE INTEGER <GEOG> TRIGGER ASSIGN TRIGGER_EQ calltype = TRIGGER triggering event = ASSIGN triggering subevent = value being assigned =
注意: 出力から、Oracle OLAPがtrigger_eq プログラムを3回コールしていることがわかります。そのたびに値がpercent_sales に代入されます。 |
sales
およびpercent_sales
に対してREPORTコマンドを発行すると、計算の結果を参照できます。percent_sales
変数には、大陸ごとの売上比率を表す値が格納されています。
GEOG SALES -------------- -------------------- North America 0.59 Europe 9.35 Asia NA GEOG PERCENT_SALES -------------- -------------------- North America 6 Europe 94 Asia NA
例10-164 ASSIGNトリガー・プログラムでの値の設定
アナリティック・ワークスペースに次のオブジェクトがあるとします。
DEFINE GEOGRAPHY DIMENSION TEXT WIDTH 12 LD Geography Dimension Values DEFINE PRODUCT DIMENSION TEXT WIDTH 12 LD Product Dimension Values DEFINE TIME DIMENSION TEXT WIDTH 12 LD Time Dimension Values DEFINE CHANNEL DIMENSION TEXT WIDTH 12 LD Channel Dimension Values DEFINE F.MARGIN FORMULA DECIMAL <CHANNEL GEOGRAPHY PRODUCT TIME> LD Margin EQ f.sales-f.costs DEFINE F.COSTS VARIABLE SHORT <GEOGRAPHY PRODUCT CHANNEL TIME> LD Costs DEFINE F.SALES VARIABLE SHORT <GEOGRAPHY PRODUCT CHANNEL TIME> LD Sales
f.costs
、f.sales
およびf.margin
のディメンションは、すべて同じです。
ここで、t.margin
というプログラムを実行するf.margin
にAssignトリガーを追加します。f.margin
の定義は次の定義に変更されます。
DEFINE F.MARGIN FORMULA DECIMAL <CHANNEL GEOGRAPHY PRODUCT TIME> LD Margin TRIGGER ASSIGN T.MARGIN EQ f.sales-f.costs
今度は、t.marginプログラムを実際に作成します。f.margin
計算式に式を代入すると、このプログラム(計算式)は、この値を使用してf.costs
およびf.sales
の新しい値を計算します。
DEFINE T.MARGIN PROGRAM PROGRAM ARG newVal DECIMAL " The value passed to the program by the Assign trigger VARIABLE t.valDiff DECIMAL " Difference between newVal and old value VARIABLE t.costInc DECIMAL " Amount the difference makes to costs "show the value of newVal SHOW 'newVal = ' NONL SHOW newVal " Compute the difference between the current value and the new one t.valDiff = newVal - f.margin " Now increase costs proportional to their existing amounts t.costInc = (newVal - f.margin) * (f.costs/f.sales) " Adjust the values of sales and costs to get the new value SET1 f.costs = f.costs + t.costInc SET1 f.sales = f.sales + t.valDiff + t.costInc SHOW geography NONL SHOW ' ' NONL SHOW product NONL SHOW ' ' NONL SHOW channel NONL SHOW ' ' NONL SHOW time NONL SHOW ' f.costs = 'NONL SHOW f.costs NONL SHOW ' f.sales = 'NONL SHOW f.sales END
ここで、次のLIMIT文を発行してデータのサブセットを指定し、REPORT文を発行してf.marginの値に関するレポートを作成するとします。
LIMIT t0.hierdim TO 'STANDARD' LIMIT time TO t0.levelrel EQ 'L2' LIMIT geography TO FIRST 1 LIMIT channel TO FIRST 1 LIMIT product TO FIRST 5 REPORT DOWN time ACROSS product: f.margin GEOGRAPHY: WORLD CHANNEL: TOTALCHANNEL -----------------------F.MARGIN----------------------- -----------------------PRODUCT------------------------ TIME TOTALPROD AUDIODIV PORTAUDIO PORTCD PORTST -------------- ---------- ---------- ---------- ---------- ---------- Q1.96 54,713,974 29,603,546 5,379,661 2,480,914 1,615,708 Q2.96 63,919,784 34,594,087 6,331,848 2,869,265 1,931,785 Q3.96 58,303,490 31,543,152 5,792,725 2,616,515 1,795,701 Q4.96 71,197,892 38,383,878 7,059,581 3,163,804 2,232,880 Q1.97 55,489,723 29,989,262 5,368,237 2,491,475 1,607,344 Q2.97 41,687,908 22,532,979 4,070,725 1,855,992 1,245,161
今度は、f.margin
の値を10%ずつ増加する次の代入文を発行し、レポートを作成します。
f.margin = f.margin * 1.1
この代入文の実行により、t.margin
というAssignトリガー・プログラムの実行がトリガーされます。このプログラムの出力は次のとおりです。
newVal = 60,185,371.40 WORLD TOTALPROD TOTALCHANNEL Q1.96 f.costs = 1,298,474.00 f.sales = 61,483,840.00 newVal = 32,563,900.67 WORLD AUDIODIV TOTALCHANNEL Q1.96 f.costs = 664,226.90 f.sales = 33,228,130.00 newVal = 5,917,626.67 WORLD PORTAUDIO TOTALCHANNEL Q1.96 f.costs = 97,976.04 f.sales = 6,015,603.00 newVal = 2,729,005.43 WORLD PORTCD TOTALCHANNEL Q1.96 f.costs = 34,301.53 f.sales = 2,763,307.00 newVal = 1,777,278.95 WORLD PORTST TOTALCHANNEL Q1.96 f.costs = 25,160.72 f.sales = 1,802,440.00 newVal = 70,311,762.13 WORLD TOTALPROD TOTALCHANNEL Q2.96 f.costs = 1,504,051.00 f.sales = 71,815,820.00 newVal = 38,053,495.70 WORLD AUDIODIV TOTALCHANNEL Q2.96 f.costs = 768,788.10 f.sales = 38,822,280.00 newVal = 6,965,032.86 WORLD PORTAUDIO TOTALCHANNEL Q2.96 f.costs = 114,558.20 f.sales = 7,079,591.00 newVal = 3,156,191.20 WORLD PORTCD TOTALCHANNEL Q2.96 f.costs = 39,256.88 f.sales = 3,195,448.00 newVal = 2,124,963.02 WORLD PORTST TOTALCHANNEL Q2.96 f.costs = 29,780.54 f.sales = 2,154,744.00 newVal = 64,133,838.86 WORLD TOTALPROD TOTALCHANNEL Q3.96 f.costs = 1,350,733.00 f.sales = 65,484,570.00 newVal = 34,697,467.06 WORLD AUDIODIV TOTALCHANNEL Q3.96 f.costs = 691,887.10 f.sales = 35,389,360.00 newVal = 6,371,997.63 WORLD PORTAUDIO TOTALCHANNEL Q3.96 f.costs = 103,203.70 f.sales = 6,475,202.00 newVal = 2,878,166.40 WORLD PORTCD TOTALCHANNEL Q3.96 f.costs = 35,358.18 f.sales = 2,913,525.00 newVal = 1,975,270.68 WORLD PORTST TOTALCHANNEL Q3.96 f.costs = 27,339.77 f.sales = 2,002,611.00 newVal = 78,317,681.06 WORLD TOTALPROD TOTALCHANNEL Q4.96 f.costs = 1,618,915.00 f.sales = 79,936,590.00 newVal = 42,222,265.94 WORLD AUDIODIV TOTALCHANNEL Q4.96 f.costs = 826,923.40 f.sales = 43,049,190.00 newVal = 7,765,539.34 WORLD PORTAUDIO TOTALCHANNEL Q4.96 f.costs = 123,269.50 f.sales = 7,888,809.00 newVal = 3,480,184.35 WORLD PORTCD TOTALCHANNEL Q4.96 f.costs = 41,998.90 f.sales = 3,522,183.00 newVal = 2,456,168.00 WORLD PORTST TOTALCHANNEL Q4.96 f.costs = 33,357.19 f.sales = 2,489,525.00 newVal = 61,038,695.03 WORLD TOTALPROD TOTALCHANNEL Q1.97 f.costs = 1,423,963.00 f.sales = 62,462,660.00 newVal = 32,988,187.65 WORLD AUDIODIV TOTALCHANNEL Q1.97 f.costs = 679,477.80 f.sales = 33,667,660.00 newVal = 5,905,060.56 WORLD PORTAUDIO TOTALCHANNEL Q1.97 f.costs = 158,854.40 f.sales = 6,063,915.00 newVal = 2,740,622.56 WORLD PORTCD TOTALCHANNEL Q1.97 f.costs = 53,144.41 f.sales = 2,793,767.00 newVal = 1,768,078.14 WORLD PORTST TOTALCHANNEL Q1.97 f.costs = 40,784.62 f.sales = 1,808,863.00 newVal = 45,856,698.46 WORLD TOTALPROD TOTALCHANNEL Q2.97 f.costs = 1,070,465.00 f.sales = 46,927,160.00 newVal = 24,786,276.35 WORLD AUDIODIV TOTALCHANNEL Q2.97 f.costs = 512,435.60 f.sales = 25,298,710.00 newVal = 4,477,797.64 WORLD PORTAUDIO TOTALCHANNEL Q2.97 f.costs = 118,791.70 f.sales = 4,596,590.00 newVal = 2,041,591.56 WORLD PORTCD TOTALCHANNEL Q2.97 f.costs = 39,287.77 f.sales = 2,080,879.00 newVal = 1,369,677.57 WORLD PORTST TOTALCHANNEL Q2.97 f.costs = 30,038.08 f.sales = 1,399,716.00
例10-165 計算式に関するASSIGNトリガー
Oracle OLAPが値の計算式への代入をどのように処理するかは、Assignトリガーが計算式の定義の一部として計算式に存在するかどうかによって異なります。
アナリティック・ワークスペースに次の定義と値を持つオブジェクトが格納されているとします。
DEFINE geog.d DIMENSION TEXT DEFINE time.d DIMENSION TEXT DEFINE sales VARIABLE DECIMAL <time.d geog.d> DEFINE f_modified_sales FORMULA DECIMAL <time.d geog.d> EQ sales+20
sales
のレポートでは、ベース値が表示されます。
-------------------SALES------------------- ------------------TIME.D------------------- GEOG.D Jan2004 Feb2004 Mar2004 2004 -------------- ---------- ---------- ---------- ---------- Boston 4.00 4.66 5.91 NA Medford 4.37 5.80 4.45 NA San Diego 4.97 5.95 4.75 NA Sunnydale 5.85 5.26 4.08 NA
f_modified_sales
計算式のレポートでは、この計算式によって計算された値が含まれる次のレポートが表示されます。
-------------F_MODIFIED_SALES-------------- ------------------TIME.D------------------- GEOG.D Jan2004 Feb2004 Mar2004 2004 -------------- ---------- ---------- ---------- ---------- Boston 24.00 24.66 25.91 NA Medford 24.37 25.80 24.45 NA San Diego 24.97 25.95 24.75 NA Sunnydale 25.85 25.26 24.08 NA
f_modified_sales
計算式には、現在、これに関するAssignトリガーは存在しません。したがって、次のコードに示すように、f_modified_sales
に値を代入しようとすると、エラーが発生します。
f_modified_sales = 3 ORA-34142: You cannot assign values to a FORMULA.
f_modified_sales
のAssignトリガーを作成する手順は、次のとおりです。
トリガー・プログラムを定義します。
DEFINE TRIGGER_ASSIGN_MODIFIED_SALES PROGRAM PROGRAM ARGUMENT datavalue NUMBER SHOW 'description of triggering object = ' DESCRIBE &TRIGGER(NAME) SHOW JOINCHARS ('calltype = ' CALLTYPE) SHOW JOINCHARS ('triggering event = ' TRIGGER(EVENT)) SHOW JOINCHARS ('value being assigned = ' datavalue) SHOW ' ' END
次の文を使用して、Assignトリガーを計算式の定義に追加します。
CONSIDER f_modified_sales TRIGGER ASSIGN trigger_assign_modified_sales
FULLDSC f_modified_sales
文を発行すると、f_modified_sales
の新しい定義がすべて表示されます。
DEFINE F_MODIFIED_SALES FORMULA DECIMAL <TIME.D GEOG.D> TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES EQ sales+20
次の文を発行してf_modified_sales
に値を代入しても、今度はエラーが発生しません。かわりに、trigger_assign_modified_sales
トリガー・プログラムが、sales
のディメンション値ごとに1回ずつ、計16回実行されます。
f_modified_sales = 3 description of triggering object = DEFINE F_MODIFIED_SALES FORMULA DECIMAL <TIME.D GEOG.D> TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES EQ sales+20 calltype = TRIGGER triggering event = ASSIGN value being assigned = 3.00 description of triggering object = ... description of triggering object = ... description of triggering object = ... description of triggering object = ... description of triggering object = ... description of triggering object = ... description of triggering object = ... description of triggering object = ... description of triggering object = ... description of triggering object = ... description of triggering object = ... description of triggering object = ... description of triggering object = ... description of triggering object = ... description of triggering object = ...
ただし、次に示すように、f_modified_sales
についてREPORT文を発行すると、計算式を単純に実行することによって計算される値は変更されていないことがわかります。
report f_modified_sales -------------F_MODIFIED_SALES-------------- ------------------TIME.D------------------- GEOG.D Jan2004 Feb2004 Mar2004 2004 -------------- ---------- ---------- ---------- ---------- Boston 24.00 24.66 25.91 NA Medford 24.37 25.80 24.45 NA San Diego 24.97 25.95 24.75 NA Sunnydale 25.85 25.26 24.08 NA