トリガーのテーブルに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;
レコードを拡張する必要があります。
また、insert
に列リストを追加し、より安全なEXECUTE ... USING
フォームを使用しました。
EXECUTE 'INSERT INTO my_table (col1, col2, col3) VALUES (?, ?, ?)' USING NEW.col1, NEW.col2, NEW.col3;
これで問題が解決しない場合は、ユースケースを詳しく説明してください。
実際には、手動でレコードを展開する必要はありません。列のnumber、sequenceおよびtypesが2つの間で一致する限りテーブルでは、これよりはるかに単純な形式を使用できます。
EXECUTE 'INSERT INTO my_table SELECT ($1).*'
USING NEW;
テーブル名が安定しているように見えるため、EXECUTE
を使用した動的SQLも必要ありません。単なるINSERT
:
INSERT INTO my_table SELECT (NEW).*
将来アプリで何が変更されるかを自問してください。
ターゲットテーブルとソーステーブルの同期を維持する必要がある場合(またはターゲットとソースが同じである場合)、列を明示的にリストすることではないのが適切です。
特定の列のみを選択し、ソーステーブルまたはターゲットテーブルへの可能な更新でそれを変更したくない場合は、列リストを指定することをお勧めします。