Alguns problemas com sua função de gatilho:
-
UseIF EXISTS (...) THEN
em vez de contar todas as ocorrências. Mais rápido, mais simples. Ver:
-
Uma função de gatilhoAFTER
INSERT OR UPDATE
pode apenas retornarNULL
.RETURN NEW
é relevante apenas para acionadores chamadosBEFORE
. 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 aEXCEPTION
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: