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;