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

Responder a