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
