2017-03-19 3 views
1

PostgreSQL 9.5でトリガ関数を記述しています。 action_flagという列がFALSEからTRUEに更新されると、関数が呼び出されます。plpgsqlを使用して関数内のカラムを更新する

order_numがあるテーブルにある場合は、FALSEからTRUEへの更新を進めてください。

それ以外の場合、order_numが他のテーブルにある場合は、例外を発生させて更新が行われないようにしたいと考えています。

IFの文内にUPDATEと書いてください。 ELSEIFの部分は期待通りに機能します。

CREATE OR REPLACE FUNCTION check_ingredient_availability() 
RETURNS TRIGGER AS 
$Body$ 
BEGIN 
    if (OLD.order_num IN (SELECT order_num 
        FROM can_prep_m_orders)) THEN 
     RAISE NOTICE 'This is a notice.'; 
     --UPDATE meal_order 
     --SET actioned_flag=TRUE 
     --WHERE order_num=OLD.order_NUM; 

     --EXECUTE 'UPDATE meal_order 
      -- SET actioned_flag=TRUE 
      --WHERE  order_num=$1' 
      --USING OLD.order_num; 
     RETURN NULL; 
    ELSEIF (OLD.order_num IN (SELECT order_num 
         FROM cannot_prep_m_orders)) THEN 
     RAISE EXCEPTION 'Missing ingredients. Cannot prepare order number %.', 
       OLD.order_num; 
     RETURN NULL; 
    ELSE 
     RETURN NULL; 
    END IF; 
END;  
$Body$ LANGUAGE plpgsql; 

答えて

0

使用EXISTS

CREATE OR REPLACE FUNCTION check_ingredient_availability() 
    RETURNS TRIGGER AS 
$func$ 
BEGIN 
    IF EXISTS (
     SELECT 1 FROM can_prep_m_orders 
     WHERE order_num = NEW.order_num -- NEW !? 
     ) THEN 
     RAISE NOTICE 'This is a notice.'; 

     -- do nothing, let original UPDATE proceed 

     RETURN NEW; -- let UPDATE proceed 
    END IF; 

    IF EXISTS (
     SELECT 1 FROM cannot_prep_m_orders 
     WHERE order_num = NEW.order_num -- NEW!? 
     ) THEN 

     RAISE EXCEPTION 'Missing ingredients. Cannot prepare order number %.', NEW.order_num; 
             -- I assume you want to mention the *new* order_num? 
    END IF; 

    RETURN NULL; -- cancel original UPDATE in all other cases 
END 
$func$ LANGUAGE plpgsql; 

関連:

、これらのチェックを実行するために、あなたのトリガーにWHEN句を追加するとき

action_flagFALSEからTRUE

CREATE TRIGGER your_trigger_name 
BEFORE UPDATE ON your_table 
FOR EACH ROW 
WHEN (NEW.action_flag AND NOT OLD.action_flag) 
EXECUTE procedure check_ingredient_availability(); 

関連に更新されます

+0

お返事、アーウィンいただきありがとうございます。これはとても役に立ちました! 私はそのことを知らなかった。更新が進むのを許すものです。 – Pizzas

+0

@Pizzas:[このマニュアルのこの章を読むことを検討する](https://www.postgresql.org/docs/current/static/plpgsql-trigger.html) –

関連する問題