2008年5月7日水曜日

PostgreSQL トリガー処理で履歴保存(plpgsql)

特定フィールドの値が変更されたら変更前の状態でログを取る。

--テーブル
CREATE TABLE table1(
id serial NOT NULL,
code smallint NOT NULL DEFAULT 0,
name character varying(20),
CONSTRAINT pk_id PRIMARY KEY (id)
)WITH (OIDS=FALSE);

--ログテーブル
CREATE TABLE table1_log(
log_id serial NOT NULL,
id integer NOT NULL DEFAULT 0,
code smallint NOT NULL DEFAULT 0,
name character varying(20),
CONSTRAINT pk_log_id PRIMARY KEY (log_id)
)WITH (OIDS=FALSE);

--仮データ作成
INSERT INTO table1(code, name) VALUES(1, '名前1');
INSERT INTO table1(code, name) VALUES(2, '名前2');
INSERT INTO table1(code, name) VALUES(3, '名前3');

--プロシージャ
CREATE OR REPLACE FUNCTION table1_rireki()
returns "trigger"
AS '
--codeが変更されたら更新前の状態でログテーブルへ追加
IF (OLD.code <> NEW.code) THEN
INSERT INTO table1_log(id, code, name)
SELECT id, code, name FROM table1 WHERE id = OLD.id;
END IF;

RETURN NEW; --NEWにしないとtable1のデータが反映されない

END;
'
language 'plpgsql';


--トリガ定義
--table1にてupdate処理前にtable1_rireki()を実行させる
CREATE TRIGGER table1_rireki
before update on table1
for each row
execute procedure table1_rireki();

 

0 件のコメント:

Google検索