2016-11-06 11 views
1

行を挿入または更新するときに実行するテーブルにPostgresトリガーを作成したいと思います。テーブルには多くの列があり、その行を別のテーブルに挿入するトリガーが必要です。しかし、他のテーブルでは、それらの列はすべて1つのJSONオブジェクト(新しいバージョンのPostgresではJSONB)に結合する必要があります。多くの列を1つのJSON列に結合するPostgresトリガー

元のテーブル

column1|column2|column3 | 
-------|-------|--------| 
A  |B  |C  | 

新しいテーブル

combined_column      | 
---------------------------------------| 
{ column1: A, column2: B, column3: C } | 

だから、トリガが上で作成されたテーブルは、例えば3列を持っているだろうが、トリガーがに挿入することを表1つの列(元の表の挿入/更新された行のすべての列を結合したJSONオブジェクト)しかありません。

+0

')(:jsonb代わりjsonto_jsonb()を使用して保存するには良いかもしれません –

答えて

0

元の形式で行を保存する方が効率的です。変換は不要で、ディスク容量も少なくて済み、高速でクリーナーです。

ちょうど同じ構造で、ログテーブルを作成します。

CREATE TABLE tbl_log AS TABLE tbl LIMIT 0; 

トリガ機能:

CREATE OR REPLACE FUNCTION trg_tbl_log() 
    RETURNS trigger AS 
$func$ 
BEGIN 
    INSERT INTO tbl_log SELECT (NEW).*; 

    RETURN NEW; 
END 
$func$ LANGUAGE plpgsql; 

トリガー:

CREATE TRIGGER tbl_log 
BEFORE INSERT OR UPDATE ON tbl 
FOR EACH ROW EXECUTE PROCEDURE trg_tbl_log(); 

を場合は、簡単にjson値に行を変換することができますあなたは、row_to_json()とする必要があります。またはより簡単に、ちょうどto_json()。あなたは `row_to_jsonを使用することができます

... 
INSERT INTO generic_js_log (json_column) SELECT to_jsonb(NEW); 
... 

JSON functions in the manual.

関連する問題