sql >> Database teknologi >  >> RDS >> PostgreSQL

Tilbageførselstransaktion ved trigger-FEJL

Et par problemer med din triggerfunktion:

  • Brug IF EXISTS (...) THEN i stedet for at tælle alle forekomster. Hurtigere, enklere. Se:

  • En triggerfunktion AFTER INSERT OR UPDATE kan bare returnere NULL . RETURN NEW er kun relevant for triggere kaldet BEFORE . Manualen :

  • Ubalanceret enkelt citat.

  • Som @Pavel forklarede , kan du ikke kontrollere transaktioner fra en plpgsql-funktion. Enhver ubehandlet undtagelse tvinger hele din transaktion til at blive rullet tilbage automatisk. Så fjern bare EXCEPTION blokere.

Din hypotetiske trigger omskrevet:

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;

En BEFORE trigger giver mere mening.

Men a UNIQUE INDEX ON ("Room_Name", "Date") ville gøre det samme, mere effektivt. Derefter rejser enhver række i strid en dubletnøgleundtagelse og ruller transaktionen tilbage (medmindre den fanges og håndteres). I moderne Postgres kan du alternativt springe over eller omdirigere sådan INSERT forsøg med INSERT ... ON CONFLICT ... . Se:

Avanceret brug:



  1. django postgresql json feltskemavalidering

  2. Postgres COUNT antal kolonneværdier med INNER JOIN

  3. Sådan finder du langsomste forespørgsler

  4. PHP PDO dynamisk opdateringsforespørgsel til MYSQL