web-dev-qa-db-ja.com

トリガープロシージャからの戻り値が必要な場合は?

トリガー手順に関するドキュメント( 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()がレコード/行を返すと仮定すると、このイベントやこのテーブルなどでプロシージャ本体が呼び出されて実行されることを理解しました...しかし、このプロシージャの戻り値はどこにありますか?

質問は、その戻り値をいつ使用するかということです。なぜこの値が必要なのですか?この戻り値を使用する例/説明を少し挙げていただけますか?

12
roy rigan

読む ドキュメント

ステートメントごとのトリガーによって呼び出されるトリガー関数は、常にNULLを返す必要があります。行ごとのトリガーによって呼び出されるトリガー関数は、必要に応じて、テーブルの行(HeapTupleタイプの値)を呼び出し元のエグゼキューターに返すことができます。操作の前に起動される行レベルのトリガーには、次の選択肢があります。

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

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

これらの動作のいずれも引き起こさない行レベルのBEFOREトリガーは、渡されたのと同じ行を結果として返すように注意する必要があります(つまり、INSERTおよびUPDATEトリガーの場合はNEW行、DELETEトリガーの場合はOLD行)。 )。

行レベルのINSTEADOFトリガーは、ビューの基になるベーステーブルからデータを変更しなかったことを示すためにNULLを返すか、渡されたビュー行(INSERTおよびUPDATE操作のNEW行、またはDELETE操作のOLD行)。 null以外の戻り値は、トリガーがビューで必要なデータ変更を実行したことを通知するために使用されます。これにより、コマンドの影響を受ける行数のカウントが増加します。 INSERTおよびUPDATE操作の場合、トリガーはNEW行を返す前に変更する場合があります。これにより、INSERTRETURNINGまたはUPDATERETURNINGによって返されるデータが変更され、提供されたものとまったく同じデータがビューに表示されない場合に役立ちます。

操作後に起動される行レベルのトリガーの戻り値は無視されるため、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)    
10
klin