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

Responder a