[pgsql-jp: 36774] 他DB、他サーバDBへの変更前、変更後のレコード保存

Matsukaze Takashi shohu33_0327 @ nifty.com
2006年 2月 27日 (月) 02:26:41 JST


松風と申します。

DB上の任意テーブルにコンソールなどから操作(UPDATE,DELETE)
行った際に、変更前、変更後のレコード情報を、同一サーバ上の他
DB、もしくは、他サーバ上のDBへ保存しようと考えております。

# 上記処理をPL/pgSQLを使用、もしくは他の方法にて実現すること
# は可能でしょうか?

※本文章に記載しているDBとはPostgreSQLを指しております。

マニュアルやWEBなどを参照し調査致しました。しかし、操作対
象DBの他テーブルへの保存は行えるようですが、同一サーバ上の
他(操作対象外)DB、及び、他サーバ上のDBへの保存を行える
ような記述を見つけることができませんでした。

以下のマニュアル記載が、私の実現しようとしていることに近いの
ですが、同一DB内の他テーブルへのINESRTに関する説明になって
おります。

http://www.postgresql.jp/document/pg813doc/html/plpgsql-trigger.html#PLPGSQL-TRIGGER-AUDIT-EXAMPLE

------------ 以下、マニュアル抜粋 ------------
例 36-3. PL/pgSQLによる監査用のトリガプロシージャ

このトリガの例では、empテーブルにおける行の挿入、更新または削除のどれも
がemp_auditテーブルの中へ確実に記録(すなわち監査)されます。現在時刻と
ユーザ名は、行った操作の種類とともにemp_auditの行の中に打刻されます。 

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
        --
		-- empで行った操作を反映する行をemp_auditに作成
		-- 操作の種類を決定するために、特殊な変数TG_OPを活用
        --
        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; -- AFTERトリガですので、結果は無視されます
    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();






pgsql-jp メーリングリストの案内