2009/11/3 Giuliani Deon Sanches <[email protected]>:
> 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

Use >=
http://www.postgresql.org/docs/current/interactive/functions-comparison.html


>        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 '

Creio que existe alguma confusão aqui.
Não existe a opção TOP 1 no PostgreSQL. Utilize a opção LIMIT 1 junto
com um ORDER BY.
http://www.postgresql.org/docs/current/interactive/sql-select.html

Creio que o correto seja:
EXECUTE 'SELECT 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.


Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a