PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Reverter transação no gatilho ERROR


Alguns problemas com sua função de gatilho:

  • Use IF EXISTS (...) THEN em vez de contar todas as ocorrências. Mais rápido, mais simples. Ver:

  • Uma função de gatilho AFTER INSERT OR UPDATE pode apenas retornar NULL . RETURN NEW é relevante apenas para acionadores chamados BEFORE . O manual :

  • Aspas simples não balanceadas.

  • Como @Pavel explicou , você não pode controlar transações de dentro de uma função plpgsql. Qualquer exceção não tratada força toda a sua transação a ser revertida automaticamente. Então, basta remover a EXCEPTION quadra.

Seu gatilho hipotético reescrito:
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;

Um BEFORE gatilho faz mais sentido.

Mas a UNIQUE INDEX ON ("Room_Name", "Date") faria o mesmo, com mais eficiência. Em seguida, qualquer linha em violação gera uma exceção de chave duplicada e reverte a transação (a menos que seja capturada e tratada). No Postgres moderno, você pode, alternativamente, pular ou desviar tais INSERT tentativas com INSERT ... ON CONFLICT ... . Ver:

Uso avançado: