Boa noite.
Eu tenho uma trigger cujo objetivo é fazer uma verificação de periodo
em uma tabela temporal.
A idéia é que durante uma edição (ou uma inserção com id igual a um já
existente) eu não possa informar um intervalo de datas conflitante com
um já existente.
A trigger esta abaixo:
CREATE OR REPLACE FUNCTION f_check_temporal_constraint() RETURNS TRIGGER AS $$
DECLARE
check_id integer;
BEGIN
IF NEW.tt_ini => NEW.tt_fim THEN
RAISE EXCEPTION 'Período inválido: '
'A data inicial é maior ou igual a data final!';
END IF;
-- a inserção de um novo registro com novo id é permitida sem problemas
IF NEW.id IS NULL THEN
RETURN NULL;
END IF;
EXECUTE 'SELECT TOP 1 id FROM $TG_TABLE_NAME$ WHERE '
|| '(NEW.id <> id) OR '
|| '(NEW.tt_ini < tt_ini OR NEW.tt_ini >= tt_fim) AND '
|| '(NEW.tt_fim <= tt_ini OR NEW.tt_fim > tt_fim) AND NOT '
|| '(NEW.tt_ini <= tt_ini AND NEW.tt_fim => tt_fim)'
INTO check_id;
IF check_id = NEW.id THEN
RAISE EXCEPTION 'Período inválido: Informações em conflito '
'com registro existente.';
END IF;
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER t_check_temporal_constraint
BEFORE INSERT OR UPDATE ON minha_tabela
FOR EACH ROW EXECUTE PROCEDURE f_check_temporal_constraint();
Porém ao utilizar ela (pois quero testar ver se a lógica esta correta)
e tentar inserir um registro recebo o seguinte erro:
ERROR: operator does not exist: timestamp without time zone =>
timestamp without time zone
LINE 1: SELECT $1 => $2
^
HINT: No operator matches the given name and argument type(s). You
might need to add explicit type casts.
QUERY: SELECT $1 => $2
CONTEXT: PL/pgSQL function "f_check_temporal_constraint" line 4 at IF
Sem a trigger os valores são inseridos corretamente.
--
twitter.com/giulianisanches
giulianisanches.blogspot.com
github.com/khaoz
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral