[pgsql-jp: 30476] Re: トリガを作れない

Genshirou Taki g_taki @ max-corporation.com
2003年 7月 15日 (火) 11:39:35 JST


g_takiです。

北村様
詳しい解説ありがとうございます。

On Tue, 15 Jul 2003 11:04:06 +0900
Jun Kitamura <kitamura @ zoozee.jp> wrote:
中略
> 私は、石井達夫<t-ishii @ sra.co.jp>さんの PostgreSQL完全攻略ガ
> イド(改訂版)(技術評論社)を見て、勉強してました。
> 初版が PDF で公開されています。改訂版では3章にトリガの説明が
> あります。
> http://www.sra.co.jp/people/t-ishii/PostgreSQL/postbook-pdf/

通称、シーラカンス本ですね?
Postgres er のバイブルなのでしょうか?

午後から、本屋に行ってきます。(7.3対応の本があればよいのですが。)
いつ頃出る予定でしょうか? > 石井さん
(直接メールを出したほうが良い場合は、無視してください)

> この場合、1つのトリガ用関数を、各テーブルにトリガとして実装
> したほうが良さげです。plpgsql で使えるトリガ用の特殊変数とい
> うのがあり、テーブル名も取得できます。g_taki さんもご覧になっ
> た、
> http://www.postgresql.jp/document/pg732doc/programmer/plpgsql-trigger.html
> に出てます。
> 
各テーブルにトリガを設定するというのは、やりたいことを考えれば必然的に理
解できました。
TG_RELNAMEという便利そうなものがあることまではわかったのですが・・・

以下のようなサンプルまで書いていただき、ありがとうございます。
これから読み砕いてみたいと思います。

> create or replace function fTimeStamp() returns TRIGGER as
> '
>  BEGIN
>   IF (select count(*) = 1 from update_info
>        where table_name = TG_RELNAME) THEN
>    update update_info set moddate = now()
>     -- , updatedby = current_user
>     -- (更新ユーザーは記録しなくて良いの?)
>     where table_name = TG_RELNAME
>     ;
>   ELSE
>    -- (初めての時は追加しなくて良いの?)
>    insert into update_info(
>     table_name,
>     moddate
>     -- ,updatedby
>    ) values (
>     PG_RELNAME,
>     now()
>     -- , current_user
>    );
>   END IF;
>   return NEW;
>  END;
> '
> language 'plpgsql'
> SECURITY INVOKER;
> 
> というトリガ関数を、記録が必要な全てのテーブルにトリガとして
> 実装します。
> -- でコメントアウトされているところは、更新ユーザーの記録が
> 必要な場合、カラム updatedby(text) を update_info に追加して
> ください。また、対象となるテーブル名がなかった場合、
> update_info に行を追加しなくても良いのですか? それとも手動
> で INSERT ?。そのへんはそちらのポリシーの範疇ですね。失礼し
> ました。

INSERTは後回しにするつもりでしたが、
将来的には、自動的にやらせたかったので、参考にさせていただきます。

-- 
Genshirou Taki <g_taki @ max-corporation.com>





pgsql-jp メーリングリストの案内