hereの説明と同様に、postgresql で監査テーブルを作成する必要があります。ただし、変更を行う実際のユーザーは PostgreSQL にネイティブに認識されていません。むしろ、私のアプリケーションは接続プール (psycopg2 を使用する python) を維持し、個々のユーザーは PostgreSQL ではなくアプリケーションにログインします。どのユーザーがアプリケーションから変更を行っているかを PostgreSQL に知らせるにはどうすればよいですか? それとも、すべての監査コード アプリ側を配置する必要がありますか?
1 に答える
一時テーブルを使用してこの問題を解決できました。私がやったことは次のとおりです。これは python と psycopg2 を使用して書かれていることに注意してください。
with
まず、構文を使用して psycopg2 接続プールからデータベース カーソルを取得するように Python コードを設定しました。これには、コード ブロックの終了方法に関係なく、接続がプールに自動的に返されるという追加の利点があります。次に、コンストラクトで使用されるクラスを変更してwith
、カーソルを返す前に、有用と思われるデータ (具体的にはユーザー名) を含む一時テーブルを作成しました。このテーブルは ON COMMIT DROP オプションを使用して作成されるため、接続をプールに戻すとテーブルが削除され、将来の接続の使用との競合が防止されることがわかります。
次に、この一時テーブルからユーザー名を取得する ON UPDATE トリガーを作成しました。トリガーは、psycopg2 が SQL ステートメントを実行するために使用するのと同じトランザクション内から起動されるため、一時テーブルを参照して、そこから目的のユーザー名を選択できます。トリガーが起動されたときに (データベースに直接変更を加えた場合などに) 一時テーブルが存在しない可能性を処理するために、トリガー内の SELECT ステートメントを例外処理ブロックでラップしました。一時テーブルをクエリしようとしてエラーが発生した場合は、current_user
代わりに の値を使用するようにフォールバックします。
このセットアップを使用すると、アプリケーションのユーザー名だけでなく、クライアント IP アドレスなど、必要な他のクライアント/アプリ側の情報をデータベースに渡すことができます。これにより、他の方法では PostgreSQL にアクセスできない値を記録できるようになります。 .