この質問は、この質問のフォローアップのようなものですが、十分に異なるトピックであるため、独自の議論に値すると思います。少しの背景については、それを参照できます。
新しいファイル インポート システムの一環として、この wikiページに基づく監査システムを構築しています。しかし、監査証跡に含めたいことの 1 つは、データの元となったファイルのファイル名です (これらのファイルは長期保存用にアーカイブされているため、質問があればいつでも戻ることができます)。
私ができる 1 つの方法は、import_batch レコードを作成し、そこにファイルの名前を記録してから、更新時にレコードをスタンプすることです。それは私が下っている道です。しかし、ある意味で少しぎこちない感じです。NEW.* レコードになくても、監査トリガーが import_batch_id を取得できるようにするというアイデアを考えています。これを達成できる方法が少なくともいくつかあるように思えます。
一時テーブルを作成し、そこに必要な情報 (バッチ番号やファイル名など) を格納できる関数を作成できます。これはかなりきれいに見えますが、私が理解しているように、それはトランザクションの間だけ存続します。私が理解しているように、名前の衝突について心配する必要はありません。各トランザクションには、「tmp_import_info」という名前の一時ファイルがあります。
import_batch_id (seq を持つ) だけを気にする場合は、おそらくシーケンサーの現在の値を取得できます。これがマルチユーザー設定でどのように動作するかは 100% わかりません。trans#1 が import_batch_id #222 を作成してから、trans#2 が開始して #223 を取得することは可能だと思います。そして、私の監査証跡は間違ったデータを記録します。
ここに表示されていない他のオプションはありますか? トランザクション/セッション変数を追加する方法はありますか? 基本的に、pg_settings のようなものです (ただし、値の挿入、更新、削除は可能です)。
最良の選択肢は一時テーブルかもしれないと感じています。