PostgreSQL トリガーを使用すると、INSERT または UPDATE SQL ステートメントによってテーブルに発生した変更を記録し、後で実行するためにそれらをファイルに記録できますか。
これは一時的にのみ使用されるため、手早く汚れたもので十分です。
PostgreSQL トリガーを使用すると、INSERT または UPDATE SQL ステートメントによってテーブルに発生した変更を記録し、後で実行するためにそれらをファイルに記録できますか。
これは一時的にのみ使用されるため、手早く汚れたもので十分です。
https://www.postgresql.org/docs/current/static/plpgsql-trigger.htmlからの監査トリガーの例
CREATE TABLE emp (
empname text NOT NULL,
salary integer
);
CREATE TABLE emp_audit(
operation char(1) NOT NULL,
stamp timestamp NOT NULL,
userid text NOT NULL,
empname text NOT NULL,
salary integer
);
CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$
BEGIN
--
-- Create a row in emp_audit to reflect the operation performed on emp,
-- make use of the special variable TG_OP to work out the operation.
--
IF (TG_OP = 'DELETE') THEN
INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*;
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*;
RETURN NEW;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
$emp_audit$ LANGUAGE plpgsql;
CREATE TRIGGER emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();
テーブルに格納されたクエリの監査ログが本当に必要ですか? 実行されたすべてのクエリを含むファイルを取得する最も簡単な方法は、postgresql の組み込みログを使用することです。
postgresql.conf (通常は $PG_DATA ディレクトリにあります) で、次のオプションを適切に設定します。
log_directory '/path/to/log/dir'
log_filename = 'filename.log'
log_statement = 'mod'
最後のオプションは、すべての INSERT、UPDATE、DELETE、TRUNCATE、および COPY FROM ステートメントをログに記録します。
Postgres ドキュメントの詳細: http://www.postgresql.org/docs/current/static/runtime-config-logging.html
以下のリンクは正しい方向を示しているはずです。
https://www.postgresql.org/docs/current/sql-createtrigger.html
やりたいことによっては、ロギングを有効にした方がよいでしょう。
Andreas Scherbaum による PostgreSQL テーブル ログは、トリガーを使用して特定のテーブルの INSERT、UPDATE、および DELETE を別のテーブルに記録する Postgresql 拡張機能です。
使い方は簡単です。監視したいテーブルと同じ形式の 2 つ目のテーブルを作成します。さらに、ログに記録されたデータを維持するために、いくつかの追加の列が必要です。
tablelog の 2 番目の部分は、元のテーブルまたは過去の特定の行の状態を復元できます。
私は自分で試したことはありませんが、おそらく機能しています。
tablelog に関する講演のスライドもありますが、スタックオーバーフローのアンチスパムの奇妙な点のため、ここに適切なリンクを投稿することはできません :) (http://andreas.scherbaum.la/writings/tablelog.pdf)。
http://pgfoundry.org/projects/tablelog/
http:// andreas.scherbaum.la/blog/archives/100-Log-Table-Changes-in-PostgreSQL-with-tablelog.html