あなたはこのような何か考えるかもしれません:
あなたが言うと呼ばれるPROCでこれをラップすることができます
delete ConnectionCurrentAction where connectionID = pg_backend_pid()
insert ConnectionCurrentAction(connectionID, currentActionID)
select pg_backend_pid(), uuid_generate_v4()
、audit_action_begin
注:トランザクションの開始時に
create table ConnectionCurrentAction (
connectionID int primary key,
currentActionID uuid
)
、その後に:代わりに、削除を削除して明示的に "アクション"を作成するという要件を適用することができますここに。トランザクションの終わりに
は、
audit_action_end
行います
(select currentActionID from ConnectionCurrentAction where connectionID - pg_backend_pid()(
あなたは機能audit_action_current()
あなたにそれをラップすることができます:あなたは、現在のトランザクションを知りたいときはいつでも
delete ConnectionCurrentAction where connectionID = pg_backend_pid()
現在のアクションで行が作成されたかどうかを識別できるように、currentActionIDをログに入れます。これにより、現在の論理アクションで異なる監査テーブルの行が作成された場所を特定することもできます。
uuidを使用したくない場合は、シーケンスもここで同様に動作します。私はuuidsが好きです。
出典
2017-07-07 08:21:20
Ben
実際の使用例は次のとおりです。あなたの質問は "競争状態"と "完全性の問題"を叫びます。 – spectras
コードが行を作成している場合、作成する行を追跡するのはなぜですか?この方法では、データベースに再度照会することさえせず、コードが直ちにUPDATEを送信することができます。 – spectras
これは、**複数の** plpgsqlトリガーで行われます。だから私は、イベントが作成された行(一時テーブル?タイムスタンプ列?)を追跡することも、より良い方法を見つけ出すこともできます。したがって、私の質問です。 –