web-dev-qa-db-ja.com

トリガー関数のテーブルにRECORDを挿入する

トリガーのテーブルにRECORDデータ型変数(NEW変数)を挿入したいと思います。 SQLはどのように見えますか?
以下の試みは失敗しました:

EXECUTE 'INSERT INTO my_table VALUES ' || NEW;
EXECUTE 'INSERT INTO my_table VALUES ' || NEW.*;
EXECUTE 'INSERT INTO my_table SELECT * FROM ' || NEW;
8
Egidi

レコードを拡張する必要があります。

また、insertに列リストを追加し、より安全なEXECUTE ... USINGフォームを使用しました。

EXECUTE 'INSERT INTO my_table (col1, col2, col3) VALUES (?, ?, ?)' USING NEW.col1, NEW.col2, NEW.col3;

これで問題が解決しない場合は、ユースケースを詳しく説明してください。

5
Craig Ringer

実際には、手動でレコードを展開する必要はありません。列のnumbersequenceおよびtypesが2つの間で一致する限りテーブルでは、これよりはるかに単純な形式を使用できます。

EXECUTE 'INSERT INTO my_table SELECT ($1).*'
USING NEW;

テーブル名が安定しているように見えるため、EXECUTEを使用した動的SQLも必要ありません。単なるINSERT

INSERT INTO my_table SELECT (NEW).*

括弧構文を明確にするために複合型に必要です。

将来アプリで何が変更されるかを自問してください。

  • ターゲットテーブルとソーステーブルの同期を維持する必要がある場合(またはターゲットとソースが同じである場合)、列を明示的にリストすることではないのが適切です。

  • 特定の列のみを選択し、ソーステーブルまたはターゲットテーブルへの可能な更新でそれを変更したくない場合は、列リストを指定することをお勧めします。

15