5

私は SQL と Oracle データベースを使用していますが、助けが必要です。トリガーは、私が理解するのに苦労しているものです。

テーブル A に行を挿入して、テーブル B の行を更新するときのトリガーが必要です。具体的には、主キーが、テーブル A に追加されたばかりの行の対応する外部キーと一致する行です。

たとえば、テーブル A の列 X は、テーブル B の列 Y (主キー) を参照する外部キーです。テーブル AI に行を追加するとき、テーブル B の列 Z で、列 X = 列 Y の行の数値に 1 を追加する必要があります。

これは、トリガーに関する私の限られた理解に基づいて、SQLでこれまでに取得できたものです(これが役立つ場合があります(あまり良くないことに気づき、疑似コードとして扱います))。

CREATE OR REPLACE TRIGGER test_trig
AFTER INSERT OR UPDATE ON tableA
FOR EACH ROW

BEGIN
  UPDATE tableB
  SET columnZ = columnZ + 1
  WHERE tableA.columnX = tableB.columnY;
END test_trig;
/

ありがとう

4

4 に答える 4

5

これを試して :

構文は

CREATE OR REPLACE TRIGGER test_trig
AFTER INSERT OR UPDATE ON tableA
FOR EACH ROW

BEGIN
  UPDATE tableB
  SET columnZ = columnZ + 1
  WHERE tableB.columnX = :NEW.columnX;
END test_trig; 
/

:new.columnX テーブル A columnX を参照します。

于 2013-02-09T15:16:10.137 に答える
0

(A) 履歴の保持 (B) カウンターまたは (C) データの整合性の問題のための何らかのメカニズムを実装していると思います。この場合、必要なすべての更新/その他の DML 操作を処理する pl/sql パッケージを使用して更新を実行することをお勧めします。アプリケーションが pl/sql パッケージを介してデータを更新するのがベスト プラクティスです。このようにして、プロセスを内部で制御でき、保守がはるかに簡単になります。さらに、そのテーブルにトリガーがあることを忘れた後、将来、自分の問題を救うことができます。

トリガーについて 1 つのヒントを提供できます。トリガーを使用する前に、他のすべての可能性を使い果たしていることを確認してください

于 2013-02-09T22:23:30.533 に答える
0

tableB.columnZ が参照される tableA レコードの数を表す場合、tableA の参照列が変更されない限り、tableA の UPDATE でトリガーしても意味がありません。

最初の機会: tableA.ReferenceColumn は変更されません:

CREATE OR REPLACE TRIGGER test_trig
AFTER INSERT ON tableA
FOR EACH ROW
BEGIN

  UPDATE tableB
  SET columnZ = columnZ + 1
  WHERE tableB.columnX = :NEW.columnX;
END test_trig;
/

2 番目の機会: tableA.ReferenceColumn は変更されます:

CREATE OR REPLACE TRIGGER test_trig
AFTER INSERT OR UPDATE OF columnX ON tableA
FOR EACH ROW

BEGIN

  IF UPDATING AND nvl(:OLD.columnX,0) <> 0 THEN
      UPDATE tableB
      SET columnZ = columnZ - 1
      WHERE tableB.columnX = :OLD.columnX;
  END IF:

  IF nvl(:NEW.columnX,0) <> 0 THEN
      UPDATE tableB
      SET columnZ = columnZ + 1
      WHERE tableB.columnX = :NEW.columnX;  
  END IF;

END test_trig;
/

3 番目の機会: tablaA レコードを削除できます。

CREATE OR REPLACE TRIGGER test_trig
AFTER INSERT OR DELETE OR UPDATE OF columnX ON tableA
FOR EACH ROW

BEGIN
  IF (UPDATING OR DELETING) AND nvl(:OLD.columnX,0) <> 0 THEN
      UPDATE tableB
      SET columnZ = columnZ - 1
      WHERE tableB.columnX = :OLD.columnX;
  END IF:

  IF nvl(:NEW.columnX,0) <> 0 THEN
      UPDATE tableB
      SET columnZ = columnZ + 1
      WHERE tableB.columnX = :NEW.columnX;  
  END IF;
END test_trig;
/
于 2013-02-09T15:17:54.547 に答える
0

十分なスタート。

最初に-これを邪魔にならないようにしましょう-これは十分に正規化されていません-あなたが説明する値は、データ操作時ではなく実行時に計算する必要があるようです。

次のことを考慮してください。

挿入 = 列に +1 - わかりました

更新 = ? 必ずしも列に+1するとは限りません-おそらく、他の特定のデータが変更された場合のみです。たとえば、テーブルをセット col1=col1 で更新するとどうなるでしょうか。多分あなたが望むものではないかもしれません。

削除 = ? delete は列に -1 を意味しますか?

構文:

WHERE tableA.columnX = tableB.columnY;

する必要があります

WHERE :new.columnX = tableB.columnY;
于 2013-02-09T15:04:36.493 に答える