28

PostgreSQL トリガーを使用すると、INSERT または UPDATE SQL ステートメントによってテーブルに発生した変更を記録し、後で実行するためにそれらをファイルに記録できますか。

これは一時的にのみ使用されるため、手早く汚れたもので十分です。

4

5 に答える 5

49

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();
于 2009-08-18T23:17:52.193 に答える
13

テーブルに格納されたクエリの監査ログが本当に必要ですか? 実行されたすべてのクエリを含むファイルを取得する最も簡単な方法は、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

于 2009-08-18T23:38:20.683 に答える
5

以下のリンクは正しい方向を示しているはずです。

https://www.postgresql.org/docs/current/sql-createtrigger.html

やりたいことによっては、ロギングを有効にした方がよいでしょう。

于 2009-08-18T21:52:35.017 に答える
2

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

于 2010-07-15T08:45:27.080 に答える