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

Chie.M gontakun @ check.ne.jp
2002年 12月 7日 (土) 23:34:51 JST


お世話になっております、Chieです。
Mashikiさん、ご返事ありがとうございます。

> >plpgsqlでトリガファンクションを作っています。
> >
> >このとき
> > new.カラム名 old.カラム名
> >としてデータを取得しようとしています。
> >このカラム名を変数で指定したいのですが、そういうことは出来るのでしょうか?

> これ私も試してみましたがExecuteの中ではうまくいかないようですね。
> colの値を「old.カラム名」としたり、oldもquote_itent()したりとか
> 色々試してみましたが、executeで実行するSQLでは使えないようです。
> 
> カラム名を変数で指定して、何を行いたかったのかを書いてみれば、
> 別の切り口からアドバイスをもらえる事と思います。

了解です。ちょっと長くなりますが書いてみます。

> # 複数のトリガーで1つのファンクションを共有したい
> # 具体的には.....
> # とか

まさにそんな感じです。
一つのトリガを、汎用的に使いまわしたいと考えています。

私がやろうとしているのは、テーブル更新時の履歴をとる事です。

更新履歴を取る方法は、よく例に挙がっていますが
その方法は、
テーブルと同じカラム名を2倍もつテーブルを作ってあります。
例えば、
名前、性別、住所
のカラムのテーブルに対し、
OLD名前、NEW名前、OLD性別、NEW性別、OLD住所、NEW住所、更新日
のような感じのテーブルが作られています。

この方法だと関数は簡単に作れるのですが、
実際にデータの更新が発生する時は、全てのデータが変更される
わけではなく、例えばこの例では、住所だけしか変更していなくても
レコードが1つ追加されてしまいます。
一つのテーブルにカラムが沢山ある場合は特に、無駄な気がするのです。

また、更新履歴をとりたい全テーブル分だけ、履歴用テーブルを
作成する必要があります。

更に、何らかの理由で、テーブルにカラムを追加する必要が発生した場合、
主となるテーブルだけでなく更新履歴を取るためのテーブルにも
2つのカラムを追加した上、関数自体も修正しなくてはなりません。

それで、私は更新履歴を持つテーブルは下記のように
したいと思っています。
 更新日、テーブル名、カラム名、旧データ、新データ

このテーブルに更新履歴のとりたい全テーブルの
更新したデータだけが格納されるようにしたいのです。

私の場合は、更新したデータは参照するだけですので
この方が使いやすいです。
無駄なデータも少なくなりますし、汎用性が
高いのではないかと考えます。

そこで、テーブル名とカラム名を取得して、更新したデータだけを
格納するトリガを作成し、そのトリガを、更新履歴を取りたいテーブル
全てに適用したいと考えているのです。

その為には、まず、
テーブル名とカラム名を参照できるビューをシステムカタログから
作成します。
次に、このビューからカーソルを使って、テーブル名とカラム名を
取得し変数で格納します。
そして、変数に格納されたテーブル名、カラム名を使って、
更新履歴を格納していきたいのです。

変数として指定できない場合は、列番号が取得できると
良いのですが...これもうまくいきませんでした。
(そういう考え方がPostgreSQLに存在するかどうかも
判らなかったのですが(^^ゞ)

たとえば、ACCESSのDAOやADOでは
 レコードセットオブジェクト(列番号)
という形で、フィールド名を使わなくても
0から順にフィールドの指定が可能です。

PostgreSQLで、OLD.カラム名、NEW.カラム名を使いたい場合、
カラム名を変数として取得するか
あるいは、列番号を取得してOLD/NEWのデータを
取得する方法はあるのでしょうか?

または、このような場合はどのような関数を作るのが適切なのか
別の方法でもご教授いただけるとありがたいです。

長文申し訳ありませんでした。
よろしくお願いします。

--環境-------
サーバ
 RedHat 7.3
 PostgreSQL 7.2.3
 Apache 1.3.27

クライアント
 Windows XP/Access 2002
 PostgreSQL ODBC Driver 07.01.0006 日本語版
--------------------
-----------------------------------
 From : Chie.M
      gontakun @ check.ne.jp
-----------------------------------




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