[pgsql-jp: 28241] Re: トリガファンクションのカラム名を変数で使いたい
Chie.M
gontakun @ check.ne.jp
2002年 12月 10日 (火) 15:10:26 JST
Chieです。お世話になっております。
Mashikiさんから、教えていただいた、
「トリガーファンクションとトリガーをCreateするようなファンクションを定義」
するサンプルを作ってみました。
> # ファンクションの中から「create function文」は使ったことが
> # あります(なんとマニュアルにも例で載ってる)が、
> #「create triger文」は未確認ですので注意してください。
と言うことでしたので、トリガも発行できると言う事、
ご報告いたします。
NEW.カラム名も変数が使えましたし、この方法でかなり
思った事に近い事ができそうです。
本当にありがとうございました。
下記に作成した簡単なサンプルを貼っておきます。
トリガファンクションとトリガを発行するものです。
# 私はPL/pgSQLを書いた事が殆どないので、
# 変な書き方だったりしたら突っ込んでください(^_^;)
-----------------------------------------------------
DROP TRIGGER trg_update_log ON test_data;
DROP TABLE test_data;
--テーブル
CREATE TABLE test_data(
t_id int4,
t_data CHAR(10),
edit_date timestamp
);
--データを入れておく
INSERT INTO test_data VALUES(10,'ABCDE');
INSERT INTO test_data VALUES(20,'TOKYO');
INSERT INTO test_data VALUES(30,'SAITAMA');
INSERT INTO test_data VALUES(40,'TEST');
INSERT INTO test_data VALUES(50,'KANAGAWA');
-- 更新日をセットする関数を作る関数
CREATE OR REPLACE FUNCTION fnc_Settest(text) RETURNS INT4 AS '
DECLARE
tbl_rel ALIAS FOR $1;
create_function text;
create_trigger text;
colname varchar(10) = ''edit_date'';
BEGIN
--更新日のファンクションを作成
create_function := ''CREATE OR REPLACE FUNCTION fnc_log() RETURNS OPAQUE AS ''''
BEGIN
NEW.'' || colname || '' := ''''''''now'''''''';
RETURN new;
END; '''' LANGUAGE ''''plpgsql'''';'';
--トリガー作成
create_trigger := ''CREATE TRIGGER trg_update_log
BEFORE UPDATE
ON '' || tbl_rel || ''
FOR EACH ROW
EXECUTE PROCEDURE fnc_log();'';
EXECUTE create_function;
EXECUTE create_trigger;
RETURN 1;
END;
' LANGUAGE 'plpgsql';
SELECT fnc_Settest('test_data');
--データ変更テスト
UPDATE test_data
SET t_id = 35, t_data = 'AAAZZZ'
WHERE t_id = 30;
--確認
SELECT * FROM test_data;
-----------------------------------------------------
--環境-------
サーバ
RedHat 7.3
PostgreSQL 7.2.3
Apache 1.3.27
クライアント
Windows XP/Access 2002
PostgreSQL ODBC Driver 07.01.0006 日本語版
--------------------
------------------------
From:Chie.M
gontakun @ check.ne.jp
------------------------
pgsql-jp メーリングリストの案内