1

したがって、これはかなり単純なはずですが、ドキュメントではやや複雑に見えます。私は PostgreSQL (現時点では 8.1) で SQL 関数を作成しました。これは、文字列入力に対してクリーンアップを行います。価値のあることとして、文字列は LDAP 識別名であり、コンマの後に一貫してスペースがないようにしたいと考えています。関数は clean_dn() であり、クリーンな DN を返します。別のいくつかの列へのすべての入力を小文字などに強制するために同じことをしたい-これは、この部分を理解すれば簡単なはずです。

とにかく、誰かがその列に挿入または更新および変更しようとするたびに、この関数をテーブルの「dn」列で実行したいと考えています。しかし、私が見つけることができるすべてのルールの例は、すべての挿入/更新クエリがテーブル内のすべての列を常に変更することを前提としているようです。私の状況では、そうではありません。私が本当に欲しいと思うのは、true または false を返すのではなく値を変更するだけの制約ですが、SQL の制約の考え方では意味がないようです。ルールで NEW テーブルに UPDATE を実行する必要がありますか? NEW 値の可能な組み合わせごとに新しいルールを作成する必要がありますか? また、列を追加する場合、考えられるすべての新しい列の組み合わせを反映するために、すべてのルールの組み合わせを調べて更新する必要がありますか?

簡単な方法があるはずです...

4

1 に答える 1

0

まず、現在のバージョンの PostgreSQL に更新します。8.1 はとうの昔に死んで忘れられ、サポートされておらず、非常に古いものです..私の言いたいことはわかりますか? 現在のバージョンは PostgreSQL 9.2です。

次に、ルールの代わりにトリガーを使用します。もっと簡単です。ほとんどの人が通る道です。そうです。

col表の列の場合tbl...

まず、トリガー関数を作成します。

CREATE OR REPLACE FUNCTION trg_tbl_insupbef()
  RETURNS trigger AS
$BODY$
BEGIN

NEW.col := f_myfunc(NEW.col);  -- your function here, must return matching type

RETURN NEW;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

次に、トリガーで使用します。
古い Postgres 8.1 の場合:

CREATE TRIGGER insupbef
  BEFORE INSERT OR UPDATE
  ON tbl
  FOR EACH ROW
  EXECUTE PROCEDURE trg_tbl_insupbef();

現代の Postgres (9.0+) の場合

CREATE TRIGGER insbef
  BEFORE INSERT OR UPDATE OF col  -- only call trigger, if column was updated
  ON tbl
  FOR EACH ROW
  EXECUTE PROCEDURE trg_tbl_insupbef();

より多くのものを1つのトリガーに詰め込むことはできますが、1つの列だけでUPDATEトリガーを条件付けることはできません...

于 2012-10-08T23:56:12.567 に答える