2017-05-10 4 views
2

トリガプロシージャに関するドキュメント(https://www.postgresql.org/docs/9.6/static/plpgsql-trigger.html):「トリガ関数は、NULLまたはレコード/行のいずれかを返さなければなりません。トリガプロシージャから戻り値が必要なときは?

CREATE TRIGGER my_trigger 
AFTER INSERT ON table_name 
FOR EACH ROW EXECUTE PROCEDURE some_trigger_function(); 

と仮定some_trigger_function()戻りレコード/行、Iは、プロシージャ本体は、この表には、このイベントで呼び出されて実行されることが理解など...しかし、ここで戻り値は、この手順を?

質問:私たちはその戻り値を使用しますか?なぜこの価値が必要なのか?あなたはこの戻り値を使用する小さな例/説明を与えることができますか?

答えて

0

the documentationで読む:文単位のトリガによって呼び出さ

トリガ関数は常に リターンNULLする必要があります。行単位のトリガーによって呼び出されるトリガー関数は、 が選択されている場合、呼び出し側実行プログラムに テーブル行(HeapTupleタイプの値)を返すことができます。

  • それは、現在の行に対する操作をスキップするようにNULLを返すことができる:操作前に焼成行レベルのトリガーは 以下の選択肢を有します。これは、エグゼキュータが、 がトリガーを呼び出す行レベルの操作(特定のテーブル行の挿入、変更、または削除)を実行しないように指示します。

  • 行レベルのINSERTおよびUPDATEトリガーの場合のみ、返される行は挿入される行になります。つまり、 が更新された行が置き換えられます。これにより、トリガー機能は が挿入または更新されている行を変更できます。

(渡された同じ行 つまり、INSERTのための新しい行とその結果として返すように注意しなければならない これらの動作のいずれかを引き起こすことを意図していないBEFOREトリガー行レベルUPDATE トリガー、DELETEトリガーのOLDロー)。 INSTEAD OFトリガー

行レベルは、ビューの基礎となるから テーブルを任意のデータを変更しなかったこと を示すためにNULLを返すべきか、それが(新 行に渡されたビュー行を返すべきINSERTおよびUPDATE操作、またはDELETE 操作のOLD行)。非ゼロの戻り値は、トリガー がビュー内で必要なデータ変更を実行したことを通知するために使用されます。これにより、 は、コマンドによって影響を受ける行の数を に増やします。 INSERT操作とUPDATE操作の場合、トリガーはNEW行を返す前にNEWを変更することがあります( )。これにより、 が返されたデータがINSERT RETURNINGまたはUPDATE RETURNINGに変更され、ビューで と同じデータが表示されない場合に便利です。

操作の後に発生する行レベルのトリガーでは、戻り値は無視され、NULLを戻すことができます。

create table my_table(id int); 

-- do not insert rows with id > 10 
create or replace function before_insert_on_my_table() 
returns trigger language plpgsql as $$ 
begin 
    return case 
     when new.id > 10 then null 
     else new 
    end; 
end $$; 

create trigger before_insert_on_my_table 
before insert on my_table 
for each row execute procedure before_insert_on_my_table(); 

insert into my_table 
values (15), (10), (5), (20) 
returning id; 

id 
---- 
10 
    5 
(2 rows)  

以下の例では、条件付きトリガーで挿入を中止する方法を示して

関連する問題