2

私は DBMS 試験のために勉強していて、いくつかのトリガーを実行しようとしていました。「標準」の行トリガーでは問題ありませんが、ステートメントトリガーで問題が発生しました。

演習では、特定の列の値の合計が更新されて最小値 (30) を下回った場合に例外を発生させるトリガーを作成します。

したがって、テーブルは次のようになります。

ID | VALUE
----------
 1 |  23
 2 |  11
 3 |  14

更新は次のようになります

UPDATE TABLE SET VALUE = VALUE - 10

前の合計は 48 で、更新後の合計は 18 になるため、これは例外をスローするはずです。

行トリガーを試してみましたが、同じテーブルで選択を行うと「変化するテーブル」の警告がスローされるため、これを探して、トリガーの設計が不十分であることが原因であると考えました。

おそらくステートメント トリガーを実装する必要がありますが、new_table または old_table にアクセスできないようで、それらの記述方法がわかりません。非常に単純に見えるので、それは不自由ですが、有用なものや例が見つかりませんでした。

何か助けはありますか?

前もって感謝します!

編集:

また、new_table/old_table 参照はOracleに存在するようです ..

4

2 に答える 2

2

次のようなことを試してください:

CREATE OR REPLACE TRIGGER trg_xyz
AFTER UPDATE ON tableX
DECLARE
  v_sum number;
BEGIN

  SELECT SUM(VALUE) into v_sum
  FROM tableX;

  IF v_sum < 30 THEN
    raise_application_error(-20001,"ERROR MESSAGE");
  END IF;
END;
/
于 2013-02-09T23:45:09.043 に答える
0

Oracleの構文はわかりませんがnew_table、SQLServerと同じだと思いINSERTEDます。もしそうなら、このようなもの:

CREATE TRIGGER TableName_U
BEFORE UPDATE
IF (SELECT SUM(VALUE) FROM new_table) < 30 THEN
    BEGIN
        raise error syntax
        abort update syntax
    END
于 2013-02-09T23:17:22.580 に答える