以前投稿した
の続きです。
データベースの変更は出来るが、プログラムは変更出来ないシステムとの連携で
あるテーブルのあるカラムが変更された場合に実行したい処理があるがどうしようかとなった際、トリガーを利用することにしました。
以前記事にしたCOPYコマンドで外部プログラムを利用するPROGRAMパラメータを利用します。
まずCOPY先テーブルとして適当なテーブルを用意します。
1 2 |
CREATE TABLE empty_table (col1 text); |
更新されるテーブルを用意します。
1 2 |
database# CREATE TABLE update_table (col1 integer); |
update_tableが更新された場合に動作させるプロシジャーを作ります。
pgsqlディレクトリのファイル一覧をテキストファイルに出力するようにします。
1 2 3 4 5 6 7 8 9 10 |
CREATE OR REPLACE FUNCTION program_run() RETURNS trigger AS $BODY$ DECLARE command_string varchar; BEGIN command_string := 'ls /usr/local/pgsql > ~/hoge_oldval_'||OLD.col1||'_newval_'||new.col1||'.txt'; EXECUTE 'COPY empty_table FROM PROGRAM '''|| command_string ||''''; RETURN NEW; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; |
シングルクォートのエスケープで見にくいですね。
上記をupdate_tableが更新されたら動作するようにトリガーを作成します。
1 2 3 4 |
CREATE TRIGGER program_run_trg BEFORE UPDATE ON update_table FOR EACH ROW EXECUTE PROCEDURE program_run(); |
実際動かしてみます。
1 2 |
INSERT INTO update_table VALUES (1); |
この時点ではテキストファイルは作成されません。
1 2 |
UPDATE update_table SET col1 = 2; |
更新したのでホームディレクトリに下記名称のテキストファイルが作成されました。
hoge_oldval_1_newval_2.txt
ロールバックしてもプログラムの実行を取り消すことは出来ないのでそこは注意が必要です。