1

以下は私のテーブル構造です:

Table -Customer
CustomerID Blacklisted Customer Name
101 Y ABC
102 Y DEF

Table -Blacklist
CustomerID BlacklistID Customer Name
101 1011 ABC
102 1012 DEF

Table -Reason
BlacklistID ReasonID Reason Code
1012 02 Rcode2

メインテーブル「Customer」は顧客情報を保存するためのものです。テーブル「Customer」の更新後にトリガーがあり、テーブル「Blacklist」にレコードを挿入すると、誰かが顧客テーブルで Y としてブラックリストに登録されたものを更新します。次の場合、お客様はブラックリストに登録されていると見なされます

  • 値「Y」として Customer テーブルのブラックリストに登録された列。
  • ブラックリストと理由テーブルに顧客のレコードが存在します

今、私の要件は、バックエンドから顧客をブラックリストに登録することです。このために、以下のクエリを使用してストアド プロシージャを作成しています。

  1. update customer set blacklisted ='Y' where customerid='102';
  2. ブラックリストから var_id に BlacklistID を選択します。ここで customerid='102';
  3. reason(BlacklistID,ReasonID,ReasonCode)values(var_ id,111,'RCODE1'); に挿入します。

理由テーブルにエントリを挿入するには (ステップ 3)、外部キーである BlacklistID が必要です。顧客テーブルのトリガーが実行されると、BlacklistID の値を取得します。 cntrl が INSERT INTO reason(step-3) ステートメントに到達する前に、'Customer' テーブルが常に実行されます。提案してください。

4

3 に答える 3

3

トリガーの実行順序を確認する必要がある場合は、トリガーの作成時にこの順序を指定できます。

これは、create トリガー ステートメントのオプションFOLLOWS ...とオプションを使用して実行されます。PRECEEDS ...

マニュアルの詳細: http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#CJAEJAFB

フォローする | 先行する

同じタイミング ポイントを持つトリガーの相対的な起動を指定します。これは、目的を達成するために特定の順序で起動する必要がある crossedition トリガーを作成する場合に特に便利です。

FOLLOWS を使用して、作成中のトリガーが指定したトリガーの後に起動する必要があることを示します。従来のトリガーまたは forward crossedition トリガーに対して FOLLOWS を指定できます。

PRECEDES を使用して、作成中のトリガーが指定したトリガーの前に起動する必要があることを示します。PRECEDES は、reverse crossedition トリガーに対してのみ指定できます。

于 2013-07-17T08:16:25.847 に答える
1

これらすべてのテーブルが必要だとは思わないため、トリガーは必要ありません。

顧客テーブルでブラックリストの理由コードを使用しないのはなぜですか? ブラックリスト テーブルの目的は不明です。データを追加せず、顧客テーブルのデータを追加の id 列で繰り返すだけのようです。

または、複数の理由コードが必要な場合は、顧客 ID と理由コードを参照する blacklist_reason テーブルを使用するだけです。顧客テーブルにブラックリストに登録された列さえ必要ないと思います。

于 2013-07-17T08:16:12.250 に答える
1

はい。トリガーはステートメントの一部です。*) 同じステートメント内の複数のトリガーが実行される順序を完全に特定することはできませんが、ステートメント自体が実行されたときにすべてのトリガーが実行されることは確信できます。したがって、ステップ 2 までに、ステップ 1 のすべての更新トリガーが起動されます。

*) 実際には、デフォルトの順序は次のとおりです。

  1. トリガー前のステートメント レベル
  2. トリガー前の行レベル
  3. トリガー後の行レベル
  4. トリガー後のステートメント レベル

ただし、たとえば、トリガーの前に 2 つの行レベルがある場合、デフォルトでは、これら 2 つが実行される順序を特定することはできません。しかし、コメントから、Oracle 11 では実際に順序を指定して、それらのケースでもカバーできることがわかりました。

于 2013-07-17T07:35:27.043 に答える