特定フィールドの値が変更されたら変更前の状態でログを取る。
--テーブル
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 件のコメント:
コメントを投稿