Postgresトリガによるインクリメンタル購読
8469 ワード
データベースの移行にはインクリメンタルが含まれ、インクリメンタルデータについては、移行するテーブルのdml操作をトリガで追跡して記録できます.この方法はdml監査にも適用できます.操作は以下の通りである:1、テストテーブルの作成
2、hstore extensionのインストール
3、dmlレコードを格納するためのテーブルの作成
4、汎用トリガの作成
5、テストテーブルにトリガを作成する
6、JAVAコードでdmlを読み取るrecordテーブルに記録し、インクリメンタルデータを生成するSQL文をターゲットデータベースにインポートし、インクリメンタル移行を完了します.7、インクリメンタル移行が完了したら、関数、トリガ、レコードテーブルを削除すればよい.
CREATE TABLE test (
id int primary key,
info varchar(255)
)
2、hstore extensionのインストール
CREATE EXTENSION hstore
3、dmlレコードを格納するためのテーブルの作成
CREATE TABLE IF NOT EXISTS dml_record (
id serial8 primary key,
-- schema
schema_name text,
--
table_name text,
level text,
-- :INSERT、UPDATE、DETELE
operation text,
--
old_record hstore,
--
new_record hstore,
-- dml
dml_time timestamp without time zone DEFAULT now()
);
4、汎用トリガの作成
CREATE OR REPLACE FUNCTION dml_trace()
RETURNS trigger LANGUAGE plpgsql
AS $BODY$
DECLARE
v_new_rec hstore;
v_old_rec hstore;
BEGIN
case TG_OP
when 'DELETE' then
v_old_rec := hstore(OLD.*);
insert into dml_record (schema_name, table_name, level, operation, old_record) values (tg_table_schema, tg_table_name, tg_level, tg_op, v_old_rec);
when 'INSERT' then
v_new_rec := hstore(NEW.*);
insert into dml_record (schema_name, table_name, level, operation, new_record) values (tg_table_schema, tg_table_name, tg_level, tg_op, v_new_rec);
when 'UPDATE' then
v_old_rec := hstore(OLD.*);
v_new_rec := hstore(NEW.*);
insert into dml_record (schema_name, table_name, level, operation, old_record, new_record) values (tg_table_schema, tg_table_name, tg_level, tg_op, v_old_rec, v_new_rec);
else return null;
end case;
RETURN null;
END;
$BODY$ strict;
5、テストテーブルにトリガを作成する
CREATE TRIGGER tg AFTER DELETE or INSERT or UPDATE
ON test FOR EACH ROW EXECUTE PROCEDURE dml_trace()
6、JAVAコードでdmlを読み取るrecordテーブルに記録し、インクリメンタルデータを生成するSQL文をターゲットデータベースにインポートし、インクリメンタル移行を完了します.7、インクリメンタル移行が完了したら、関数、トリガ、レコードテーブルを削除すればよい.