PostgreSQL のトリガーは初めてです。この例に
は 3 つのテーブルがあります。table1
table2
table3
- トリガーは の新しいレコードで起動し
table1
ます。 - トリガー関数は、からの新しいレコード
table2
と同じである のすべてのレコードをループします。product_id
table1
table3
最初の 2 つのテーブルからいくつかの混合値に挿入します。- その後、
INSERT
テスト目的で同じクエリがテスト テーブルに挿入されます。
問題は、INSERT
オンtable3
が起こっていないことです。テスト中のINSERT
テーブルは問題なく、ログに記録された挿入クエリは問題なく実行できるため、トリガー/関数内で実行されない理由がわかりません。
関数の作成または置換 my_trigger() はトリガーを $my_trigger$ として返します DECLARE r RECORD; 始める FOR r IN SELECT t2.id_t2、t2.name_1、t2.name_2、t2.name_3 FROM table2 t2 WHERE t2.product_id=NEW.product_id ループ EXECUTE 'INSERT INTO table3 (id_t3, id_t1, name_1, name_2, name_3, bool_t2) VALUES (' || r.id_t2 || ',' || NEW.id_t1 || ', ''' || r.name_1 || ''',''' || r.name_2 || ''',''' || r.name_3 || ''', TRUE);'; INSERT INTO テスト (field1, field2) VALUES(r.id_t2, 'INSERT INTO table3 (id_t3, id_t1, name_1, name_2, name_3, bool_t2) VALUES (' || r.id_t2 || ',' || NEW.id_t1 | || ', ''' || r.name_1 || ''',''' || r.name_2 || ''',''' || r.name_3 || ''', TRUE);') ; エンドループ; 戻る新しい; 終わり; $my_trigger$ LANGUAGE plpgsql;
編集: @Rachcha が尋ねたように、トリガー自体は次のように定義されます。
CREATE TRIGGER my_trigger
AFTER INSERT
ON table1
FOR EACH ROW
EXECUTE PROCEDURE my_trigger();
編集 2: なしで挿入しようとしましEXECUTE
たが、結果は同じです: エラーはありませんが、フィールドは に挿入されませんtable3
。