2

PostgreSQL のトリガーは初めてです。この例に
は 3 つのテーブルがあります。table1table2table3

  • トリガーは の新しいレコードで起動しtable1ます。
  • トリガー関数は、からの新しいレコードtable2と同じである のすべてのレコードをループします。product_idtable1
  • 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

4

1 に答える 1

1

よりシンプルな機能

  • 引き金を引くRETURN NEWのは意味がありません。AFTER代わりに使用RETURN NULLします。ここでマニュアルを引用する:

    操作後に起動される行レベルのトリガーの場合、戻り値は無視されるため、NULLを返すことができます。

  • を使用しても意味がありませんLOOP。代わりに、単純なSQLステートメントを使用してください。

  • 動的SQL(EXECUTE)を使用しても意味がありません。

CREATE OR REPLACE FUNCTION my_trigger()
  RETURNS TRIGGER AS
$my_trigger$
BEGIN

INSERT INTO table3 (id_t3, id_t1, name_1, name_2, name_3, bool_t2)
SELECT t2.id_t2, NEW.id_t1, t2.name_1, t2.name_2, t2.name_3, TRUE
FROM   table2 t2
WHERE  t2.product_id = NEW.product_id;

INSERT INTO test (field1, field2)
SELECT t2.id_t2, '??un_known??'
FROM   table2 t2
WHERE  t2.product_id = NEW.product_id;

RETURN NULL;

END
$my_trigger$ LANGUAGE plpgsql;

これは機能しているはずです!->SQLfiddleデモ

デバッグ

それが機能しない場合、問題はあなたの質問にない何かです。またはテーブルで定義されているのトリガーまたはルールはありますか?table1test

デバッグするには、この行をトリガー関数に追加して、そこに到達するかどうか、および値が何であるかを確認しますNEW

RAISE EXCEPTION 'Values in NEW: %', NEW::text;
于 2013-03-19T16:47:19.460 に答える