0

最近、私のチームは、共有テスト データベースの一部のレコードが明確な理由もなく消えるという状況に遭遇しました。これは共有データベース (非常に多くのチームが利用している) であるため、それがプログラミングのミスなのか、誰かが間違った SQL スクリプトを実行しただけなのかを追跡することはできません。

そのため、特定のテーブル A の行が削除されたときに (データベース レベルで) 通知する方法を探しています。Postgres TRIGGER を確認しましたが、削除の原因となった特定の SQL を特定できませんでした。

とにかくテーブルAのいくつかの行を削除するSQLステートメントをログに記録できますか?

4

2 に答える 2

2

このようなものを使用できます。

選択したテーブルへのすべての変更をログに記録する、PostgreSQLテーブル用の特別なトリガーを作成できます。

このトリガーはクエリをログに記録し、(を介して)変更を引き起こす可能性がありますcurrent_query()

これをベースとして使用すると、ログに記録するフィールド/情報をさらに追加できます。

于 2012-12-27T14:09:47.953 に答える
1

これを実際の postgres 構成ファイルに対して行います。

http://www.postgresql.org/docs/9.0/static/runtime-config-logging.html

log_statement (列挙型)

Controls which SQL statements are logged. Valid values are none (off), ddl, mod, and all (all statements). ddl logs all data

CREATE、ALTER、DROP ステートメントなどの定義ステートメント。mod は、すべての ddl ステートメントに加えて、INSERT、UPDATE、DELETE、TRUNCATE、COPY FROM などのデータ変更ステートメントをログに記録します。含まれているコマンドが適切なタイプである場合、PREPARE、EXECUTE、および EXPLAIN ANALYZE ステートメントもログに記録されます。拡張クエリ プロトコルを使用しているクライアントの場合、Execute メッセージを受信するとログが記録され、Bind パラメータの値が含まれます (埋め込まれた一重引用符は 2 重になります)。

The default is none. Only superusers can change this setting.

ddl または all を選択します。変更する必要があるのは次のとおりです
data/postgresql.confファイルで、log_statement設定を「all」に変更します。さらに、以下も検証する必要がある場合があります。

1) make sure you have turned on the log_destination variable
2) make sure you turn on the logging_collector
3) also make sure that pg_log actually exists relative to your data directory, and that the postgres user can write to it.

ここから撮影

于 2012-12-27T13:57:24.037 に答える