sql >> データベース >  >> RDS >> PostgreSQL

トリガーエラーでのロールバックトランザクション

    トリガー機能に関するいくつかの問題:

    • を使用します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 ...で試行します 。参照:

    高度な使用法:



    1. MySQLで行を列に動的に転置する方法

    2. SQL Server:XML 出力を使用した 2 レベルの GROUP BY

    3. クエリの最適化-時間がかかりすぎてサーバーを停止します

    4. リレーショナルデータベースで継承モデリングを行う方法は?