[pgsql-jp: 28228] Re: トリガファンクションのカラム名を変数で使いたい

Mashiki mashiki @ yanah.com
2002年 12月 9日 (月) 14:33:30 JST


 Mashikiです。

>一つのトリガを、汎用的に使いまわしたいと考えています。
>
>私がやろうとしているのは、テーブル更新時の履歴をとる事です。
 :
 :
>それで、私は更新履歴を持つテーブルは下記のように
>したいと思っています。
> 更新日、テーブル名、カラム名、旧データ、新データ
>
>このテーブルに更新履歴のとりたい全テーブルの
>更新したデータだけが格納されるようにしたいのです。

1つのテーブルに変更履歴を格納するのは面白いけど、
列「旧データ」と列「新データ」の型はどうするのでしょうか。

 :
 :
>そこで、テーブル名とカラム名を取得して、更新したデータだけを
>格納するトリガを作成し、そのトリガを、更新履歴を取りたいテーブル
>全てに適用したいと考えているのです。
 :
>または、このような場合はどのような関数を作るのが適切なのか
>別の方法でもご教授いただけるとありがたいです。

別の方法ですが、テーブル名を引数として渡すと、「渡されたテーブルの
情報をシステムカタログから取得して、更新履歴を取るトリガーファンク
ションとトリガーをCreateする」ようなファンクションを定義して、ログ
取得の必要のあるテーブルをCreate または Alter したときに呼び出せば
よいのではないでしょうか。

・トリガー(ファンクション及びトリガー)作成ファンクションの作成
 これはテーブルに依存しない関数で、一度だけ実行しておきます。

・テーブルAをCreate
・ファンクションを実行「select SetTriger('テーブルA');」
  内部的に 「create function GetLog_テーブルA() returns ... 」
  と「create trigger trgGetLog_テーブルA AFTER UPDATE on 
  テーブルA...」が実行される
・テーブルAの行が更新されると「trgGetLog_テーブルA」トリガーにより、
 GetLog_テーブルA()が呼び出され、履歴テーブルに変更箇所がInsertさ
 れる

もし、テーブルに修正が入ったときも、ALTER TABLE テーブルA...:の後、
select SetTriger('テーブルA');を流すだけくらいなら、手間にも
ならないとおもいますが、いかがでしょうか。

# ファンクションの中から「create function文」は使ったことが
# あります(なんとマニュアルにも例で載ってる)が、
#「create triger文」は未確認ですので注意してください。 



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