2

PostgreSQL では、テーブルに行を挿入または更新する前に、いくつかの検証を行い、いくつかのクエリを実行するためのトリガー プロシージャを作成しました。

CREATE FUNCTION RECORDS_VALIDATE() RETURNS TRIGGER AS $$
DECLARE
 tblVar text := dynamically im creating table name;
BEGIN
IF NEW.date <= CURRENT_DATE THEN
 RAISE NOTICE 'DATE IS LESS THAN THE CURRENT DATE'; 
 RETURN NULL;   
END IF;

IF (TG_OP = 'UPDATE') THEN
  EXECUTE 'UPDATE '|| tblVar || ' SET id = $1,date = $2 where id = $3'
  USING NEW.id,NEW.date,OLD.id;
 RETURN NULL;
END IF;
IF(TG_OP = 'INSERT') THEN 
  EXECUTE 'INSERT INTO ' || tblVar || ' VALUES($1,$2)' 
  USING NEW.id, NEW.date;
  RETURN NULL;
END IF;
END;
$$ LANGUAGE plpgsql;

引き金

CREATE TRIGGER RECORDS BEFORE INSERT OR UPDATE ON RECORDS
FOR EACH ROW EXECUTE PROCEDURE RECORDS_VALIDATE();

注: RECORDS は、このベース テーブル名のベース テーブルです。テーブルを動的に作成しているので、RECORDS に行を挿入したくないので、NULL を返します。新しく作成したテーブルに行を挿入する必要があるため、実行コマンドを使用します。新しく作成されたテーブルに行を挿入するクエリを実行しています。

INSERT
これにより、レコードではなく、新しく作成されたテーブルに行が挿入されます

INSERT INTO BILLING_RECORDS VALUES(1,date '2013-10-15');

UPDATE
この行を実行している間、新しく作成されたテーブルで更新されません。エラーも発生しません。UPDATE 0 として出力を取得しています

UPDATE RECORDS SET id = 10,date = date '2013-12-30' where id=1;
4

4 に答える 4

0

INSERT 操作のトリガーから戻るNULLと、 table にレコードは追加されませんRECORDS

テーブルを更新RECORDSし、影響を受けるレコードがない場合、トリガーは実行されません。returnステートメントをに変更しますNEW

  EXECUTE 'INSERT INTO ' || tblVar || ' VALUES($1,$2)' 
  USING NEW.id, NEW.date;
  RETURN NEW;

そしてUPDATE

  EXECUTE 'UPDATE '|| tblVar || ' SET id = $1,date = $2 where id = $3'
  USING NEW.id,NEW.date,OLD.id;
  RETURN NEW;
于 2013-10-11T10:40:32.277 に答える
0

ここでパーティショニング自動化トリガーを構築していると思います。私は最近、まったく同じ問題に取り組んでいます。

  1. ベーステーブルにはON INSERTトリガーのみを使用してください(そうだと思います)。records

    このトリガーは、レコードを目的のパーティションに移動します。

  2. 部分的には、ベースON UPDATEテーブルにトリガーを追加しても意味がありません。これは設計上空であるためです。代わりに、使用しているパーティションごとにそのようなトリガーを作成する必要があります。動的に作成する場合は、そのような各パーティションに独自のトリガーがあることを確認する必要があります。それでも、それらはすべて単一の機能を共有できます。

覚えておくべきことがもう 1 つあります。パーティション キーである列を更新するときは、特に注意する必要があります。

  • CHECK制約を使用してパーティション内のキー範囲を制限した場合、例外が発生します。
  • チェックを行わないと、データ レイアウトが乱雑になる可能性があります。

したがってUPDATE、パーティション分割キー列の代わりDELETEに、新しい値が別のパーティションに対応する場合は、代わりに+を実行する必要がありますINSERT

もう 1 つの方法は、パーティション化キー列への変更を完全に制限することです。あなたはそれを行うことができます:

  • トリガーでは、比較OLDNEW値。
  • UPDATEパーティション化キーの一部ではない列に対してのみ特権を付与します。
于 2013-10-11T11:49:57.720 に答える