sql >> Databáze >  >> RDS >> PostgreSQL

Transakce vrácení při spuštění ERROR

Několik problémů s funkcí spouštění:

  • Použijte IF EXISTS (...) THEN místo počítání všech výskytů. Rychlejší, jednodušší. Viz:

  • Spouštěcí funkce AFTER INSERT OR UPDATE stačí vrátit NULL . RETURN NEW je relevantní pouze pro spouštěče zvané BEFORE . Příručka :

  • Nevyvážená jednoduchá citace.

  • Jak @Pavel vysvětlil , nemůžete řídit transakce z funkce plpgsql. Jakákoli neošetřená výjimka vynutí automatické vrácení celé transakce. Stačí tedy odstranit EXCEPTION blokovat.

Váš hypotetický spouštěč přepsán:

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;

A BEFORE spoušť dává větší smysl.

Ale a UNIQUE INDEX ON ("Room_Name", "Date") by udělal totéž, efektivněji. Potom jakýkoli řádek v porušení vyvolá výjimku duplicitního klíče a vrátí transakci (pokud není zachycen a zpracován). V moderním Postgresu můžete alternativně přeskočit nebo odklonit takové INSERT pokusy s INSERT ... ON CONFLICT ... . Viz:

Pokročilé použití:



  1. Resetování hesla ROOT v MySQL 5.6

  2. Úvod do správy MaxScale Použití maxctrl pro MariaDB Cluster

  3. databázové otázky v sql

  4. Modul Export výsledku async fn