[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 メーリングリストの案内