Em 12 de julho de 2013 11:58, Osvaldo Kussama <[email protected]>escreveu:
> Em 12/07/13, Douglas Fabiano Specht<[email protected]> escreveu: > > Em 12 de julho de 2013 11:47, Osvaldo Kussama > > <[email protected]>escreveu: > > > >> Em 12/07/13, Douglas Fabiano Specht<[email protected]> escreveu: > >> > Bom dia pessoal, > >> > > >> > estou com uma dificuldade para criar uma regra que não permite insert > >> > de > >> > linhas duplicadas. > >> > fiz um teste simples, criei uma tabela test e a regra, mas quando vou > >> > inserir mesmo sem ter nada na tabela ele ja me acusa o erro. > >> > > >> > a regra é simples, nao pode ter o tipoacesso e numero iguais.. > >> > será que alguem teria alguma ideia? > >> > > >> > > >> > CREATE TABLE test > >> > ( > >> > chave integer, > >> > tipoacesso character(1), > >> > numero integer > >> > ) > >> > > >> > > >> > create or replace rule protect_double as > >> > on INSERT to test > >> > where chave in( > >> > select res.chave from dah.test res > >> > where new.tipoacesso='R' and new.numero=res.numero) > >> > > >> > do instead select erroDouble(); > >> > > >> > > >> > CREATE OR REPLACE FUNCTION erroDouble() RETURNS VOID AS $$ > >> > BEGIN > >> > RAISE EXCEPTION 'Numero Duplicada não permitido!!!'; > >> > END; > >> > $$ > >> > LANGUAGE plpgsql; > >> > > >> > > >> > testando o insert > >> > insert into test values(-5,'R', 1) > >> > > >> > >> > >> Não é mais simples criar um índice único nesta dupla de campos? > >> http://www.postgresql.org/docs/current/interactive/sql-createindex.html > >> > >> Osvaldo > >> _______________________________________________ > >> pgbr-geral mailing list > >> [email protected] > >> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > >> > > > > Osvaldo, > > Na verdade nao, pois em produção a regra é outra e envolve mais campos > > inclusive com null, com datas, etc. > > esse exemplo seria para testes de como funcionaria somente. > > > > > Então tente substituir o IN por EXISTS para evitar o problema com o NULL. > > Osvaldo > _______________________________________________ > pgbr-geral mailing list > [email protected] > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > Osvaldo, foi meu primeiro teste tinha feito assim: create or replace rule protect_double as on INSERT to test where exists ( select 1 from dah.test res where new.tipoacesso='R' and new.numero=res.numero) do instead select erroDouble(); -- Douglas Fabiano Specht
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
