sql >> Databasteknik >  >> RDS >> PostgreSQL

Återställ transaktion vid utlösningsfel

Ett par problem med din triggerfunktion:

  • Använd IF EXISTS (...) THEN istället för att räkna alla händelser. Snabbare, enklare. Se:

  • En triggerfunktion AFTER INSERT OR UPDATE kan bara returnera NULL . RETURN NEW är endast relevant för utlösare som kallas BEFORE . Handboken :

  • Obalanserad enkel offert.

  • Som @Pavel förklarade , kan du inte kontrollera transaktioner från en plpgsql-funktion. Alla obehandlade undantag tvingar hela din transaktion att återställas automatiskt. Så ta bara bort EXCEPTION blockera.

Din hypotetiska trigger omskriven:

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 är mer vettigt.

Men a UNIQUE INDEX ON ("Room_Name", "Date") skulle göra detsamma, mer effektivt. Sedan höjer varje rad som bryter mot ett dubblettnyckelundantag och återställer transaktionen (såvida den inte fångas och hanteras). I moderna Postgres kan du alternativt hoppa över eller avleda sådan INSERT försök med INSERT ... ON CONFLICT ... . Se:

Avancerad användning:



  1. Konstant kolumnvärde i MySQL-tabellen

  2. Släpp eller skapa databas från lagrad procedur i PostgreSQL

  3. Konfigurera SQL-jobb i SQL Server med T-SQL

  4. SQL Server 2008:Fel vid konvertering av datatyp nvarchar till float