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