[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 メーリングリストの案内