トリガー機能に関するいくつかの問題:
-
を使用します
IF EXISTS (...) THEN
すべての発生をカウントする代わりに。より速く、より簡単に。参照: -
トリガー関数
AFTER
INSERT OR UPDATE
NULL
を返すだけです 。RETURN NEW
BEFORE
と呼ばれるトリガーにのみ関連します 。 マニュアル : -
不均衡な一重引用符。
-
@Pavelが説明したように 、plpgsql関数内からトランザクションを制御することはできません。未処理の例外があると、トランザクション全体が自動的にロールバックされます。したがって、
EXCEPTION
を削除するだけです。 ブロック。
架空のトリガーが書き直されました:
CREATE OR REPLACE FUNCTION check_room()
RETURNS TRIGGER AS
$func$
BEGIN
IF EXISTS (
SELECT FROM "Sesion" -- are you sure it's not "Session"?
WHERE "Room_Name" = NEW."Room_Name"
AND "Date" = NEW."Date") THEN
RAISE EXCEPTION 'The room is rented at that date';
END IF;
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
BEFORE
トリガーの方が理にかなっています。
しかし UNIQUE INDEX ON ("Room_Name", "Date")
同じことをより効率的に行います。次に、違反している行は重複キー例外を発生させ、トランザクションをロールバックします(キャッチされて処理されない限り)。最新のPostgresでは、代わりにそのようなINSERT
をスキップまたは迂回させることができます INSERT ... ON CONFLICT ...
で試行します 。参照:
高度な使用法: