[pgsql-jp: 27812] PL/pgSQL のトリガプロシージャで SQL ログをとる方法

yoshida @ tkm.att.ne.jp yoshida @ tkm.att.ne.jp
2002年 10月 28日 (月) 16:00:14 JST


お世話になります、吉田と申します。

PL/pgSQLを利用したトリガプロシージャの質問です。

複数のテーブルに対しPL/pgSQLで作成したトリガを組み込み、
ログテーブルに、

	カラム1		変更日付(実際はDefault NOW()定義)
	カラム2		テーブル名
	カラム3		SQL文

といったような感じでログを書き出したく思っております。

そこで煮詰まっているのが、カラム3のSQL文で、PL/pgSQLの定義済み
変数のTG_OPだと、トリガを発行した操作を示す'INSERT'、'UPDATE'、'DELETE'
という各文字列は定義されているようですが、実際に欲しているトリガを発行した
操作の「SQL文」は定義されていないようです。

考えているのは、全てのテーブルに対し同じトリガを使いまわしたく且つ、
ログテーブルは1つという構成です。

このような事をやりたい場合、どのような方法をとったらよいのかを
ご教授願いたいと思います。

・・・一応、私が考えた案を以下に書き出します。
・・・かっこわるいのでできるだけ使いたくはありません。


案1
	トリガプロシージャに、ログをとられるテーブル全てのテーブル
	定義を登録し、TG_RELNAMEから取得したテーブル名により、NEW変数
	OLD変数を利用しトリガプロシージャ内部でSQL文を生成する。

	メリット:	管理が1つで行える。
	デメリット:	テーブルの増減、カラムの追加/削除 毎に、
			トリガプロシージャを修正しなければならない。


案2
	案1のロジックを各テーブル毎に分割し、ログをとられるテーブル毎に
	トリガプロシージャを組み込む。

	メリット:	変更のあるテーブルに対するトリガプロシージャのみ
			修正すればよい。
	デメリット:	テーブル数毎にトリガプロシージャを作成しなければ
			ならない。



・・・・ながながと汚い日本語を連ねてしまいましたが、良い方法をご教授
	願います。


////////////////////////////
吉田 剛
Takeshi Yoshida
Mail: yoshida @ tkm.att.ne.jp
////////////////////////////



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