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