[pgsql-jp: 29761] Re: トリガの内容表示
Chie.M
gontakun @ fish.co.jp
2003年 5月 1日 (木) 12:07:04 JST
Chie.Mです。こんにちは。
> テーブル名はtgrelidから探っていくのでしょうか?(どうやって!?)
> 呼び出すfunction名はtgfoidから探っていくのでしょうか?(どうやって!?)> キックされる条件もtgfoidから探れるのでしょうか?
普通にSQLを発行するのではダメでしょうか?
マニュアルに書いてある条件どおりに組めば、関数名とかテーブル名は
取得できると思います。
私もPostgreSQLは初心者の部類なので、pg_trrigerのテーブルの中身と
マニュアルつき合わせて挑戦してみました。
かなり適当ですが、こんな感じで↓
SELECT
A.tgname AS トリガ, C.relname AS テーブル名,
A.tgtype AS 種類, P.proname AS 関数
FROM
pg_class AS C INNER JOIN (
pg_trigger AS B INNER JOIN
pg_trigger AS A ON B.tgconstrrelid = A.tgrelid
) ON C.oid = B.tgconstrrelid INNER JOIN
pg_proc AS P ON A.tgfoid = P.oid
WHERE
A.tgisconstraint=false
GROUP BY
A.tgname, C.relname, A.tgtype, P.proname;
# 実際使う場合はもっとましなSQL書いてください^^;
# 他にもっとマシな方法があったら識者の方突っ込んでください・・・。
種類のカラムは「トリガー条件を指定するビットマスク」で
0x1:ROW、0x2:BEFORE、0x4:INSERT、0x8:DELETE、0x10:UPDATE
ということだそうです。
これはソースコードみないとダメみたいですが、過去ログに出てました。。。
この値を取得したい時は、
tgtypeの値が7の時は「BERORE INSERT FOR EACHE ROW」
tgtypeの値が19の時は「BEFORE UPDATE FOR EACH ROW」
などど、関数にでもしておけば、表示も可能だと思います。
用途にもよると思いますが、石田さんの書かれた↓こちらの方法のが
簡単かも知れません。
> それ以外の方法としては、pg_dump したファイルの中身を見れば確認できます
↓これがすごく楽しみですね。
> trigger についても、pg_get_triggerdef() という関数が
> 開発中のバージョンにははいっているようです。
> http://archives.postgresql.org/pgsql-patches/2003-03/msg00066.php
石田さん情報ありがとうございました!(^-^)
----------------------------
Chie.M <gontakun @ fish.co.jp>
pgsql-jp メーリングリストの案内