1

テーブルから格納された変数をチェックするための簡単なトリガーを作成したいと思います。
変数の値が「1」の場合は挿入を承認し
、変数の値が「2」の場合はエラー メッセージを表示します。

CREATE OR REPLACE TRIGGER approval 
BEFORE INSERT ON VIP
REFERENCING OLD AS MEMBER
FOR EACH ROW
DECLARE 
  CONDITION_CHECK NUMBER;
BEGIN
  SELECT CONDITION INTO CONDITION_CHECK FROM MEMBER; 
  IF CONDITION_CHECK = '2' THEN
    RAISE_APPLICATION_ERROR (-20000, ' UPGRADE DENIED!');
  END IF;
END;

ただし、このトリガーは、条件値が「1」の場合でも、すべてのエントリを無効にします。

4

3 に答える 3

3

:new.conditionトリガーで を参照するだけです

CREATE OR REPLACE TRIGGER approval 
  BEFORE INSERT ON VIP
  FOR EACH ROW
BEGIN
  IF :new.condition = '2' THEN
    RAISE_APPLICATION_ERROR (-20000, ' UPGRADE DENIED!');
  END IF;
END;

ただし、この種のロジックをトリガーに入れることはほとんど意味がありません。が許可された値のセットの 1 つであるCHECKことを保証する制約を列に定義する方がはるかに理にかなっています。condition

于 2012-11-13T16:58:10.580 に答える
3

トリガーを使用AFTERして条件を確認します。値は他のBEFOREトリガーによって変更できます。トリガーではAFTER、後で値が変更されないことが保証されます。

あなたの条件が欠けているようですSELECT(別のテーブルから値を取得しようとしていると思われる場合):

CREATE OR REPLACE TRIGGER approval 
AFTER INSERT ON VIP
FOR EACH ROW
DECLARE 
  CONDITION_CHECK NUMBER;
BEGIN
  SELECT CONDITION 
    INTO CONDITION_CHECK 
    FROM MEMBER 
   WHERE member_id = :new.member_id; 
  IF CONDITION_CHECK = '2' THEN
    RAISE_APPLICATION_ERROR (-20000, 'UPGRADE DENIED!');
  END IF;
END;
于 2012-11-13T17:02:23.053 に答える
0

新しいデータではなく古いデータを参照しています - おそらくそれは意図したものではありませんか?

于 2012-11-13T16:55:38.870 に答える