PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wycofaj transakcję w przypadku błędu wyzwalacza

Kilka problemów z funkcją wyzwalacza:

  • Użyj IF EXISTS (...) THEN zamiast liczenia wszystkich wystąpień. Szybciej, prościej. Zobacz:

  • Funkcja wyzwalacza AFTER INSERT OR UPDATE może po prostu zwrócić NULL . RETURN NEW dotyczy tylko wyzwalaczy o nazwie BEFORE . Podręcznik :

  • Niezrównoważony pojedynczy cytat.

  • Jak wyjaśnił @Pavel , nie można kontrolować transakcji z poziomu funkcji plpgsql. Każdy nieobsługiwany wyjątek wymusza automatyczne wycofanie całej transakcji. Po prostu usuń EXCEPTION blokować.

Twój hipotetyczny wyzwalacz przepisany:

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 wyzwalacz ma więcej sensu.

Ale a UNIQUE INDEX ON ("Room_Name", "Date") zrobiłby to samo, bardziej efektywnie. Następnie każdy wiersz z naruszeniem zgłasza wyjątek zduplikowanego klucza i wycofuje transakcję (chyba że zostanie przechwycony i obsłużony). We współczesnym Postgresie możesz alternatywnie pominąć lub przekierować takie INSERT próby z INSERT ... ON CONFLICT ... . Zobacz:

Zaawansowane użycie:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uruchom skrypt powłoki, gdy rekord bazy danych zostanie zapisany do postgres

  2. Jak zmienić nazwę bazy danych w AWS RDS dla Postgresql?

  3. Czy można wydać VACUUM ANALYZE <nazwa tabeli> z psycopg2 lub sqlalchemy dla PostgreSQL?

  4. Bezpieczny wątkowo obiekt PQconn

  5. Utwórz rolę PostgreSQL (użytkownika), jeśli nie istnieje