mais vc pode deixar o campo NULL e não em BRANCO que não tera problemas com o indexador unico.
Claudio Oliveira
http://www.msisolucoes.com.br
http://www.msisolucoes.com.br
From: "Thiago Risso" <[EMAIL PROTECTED]>
Reply-To: [email protected]
To: [email protected]
Subject: Re: [PostgreSQL-Brasil] Trigger
Date: Tue, 20 Jun 2006 09:00:54 -0300
A tabela tem cerca de 140.000 registros.
Quanto a colocar como unique eu não posso, pois posso gravar o CPF em branco, mas não posso repeti-lo ....
Eu tive que implantar essa trigger a uns dois meses atras, quando foi necessário aceitar cadastros com CPF em branco... até então era um campo unique.
E antes de colocar essa trigger os updates GERAIS (SEM WHERE - PARA TODOS OS REGISTROS) eram muito rápidos....
Já cheguei a deixar a query executando por 2 minutos ... ai tive que matar pq o banco não respondia nenhuma outra query ....
Bom... É isso ai ...
Espero que possam me ajudar...
On 6/20/06, Otacilio Neto <[EMAIL PROTECTED] > wrote:
--- Thiago Risso <[EMAIL PROTECTED] > escreveu:
> Otacilio,
>
> Eu fiz essa modificação (Colocando o IF NEW.cpf !=
> OLD.cpf) porque estava
> lento, mas mesmo assim continuou na mesma .... Nada
> resolveu ....
>
> Alterei também com o código que me passou e nada
> adiantou ....
> Quando dou um update geral a query trava ....
>
>
>
> On 6/20/06, Otacilio Neto
> < [EMAIL PROTECTED]> wrote:
> >
> >
> > --- Thiago Risso <[EMAIL PROTECTED]>
> escreveu:
> >
> > > Prezado amigos...
> > > Criei uma Trigger em uma determinada tabela para
> que
> > > o campo cpf não seja
> > > cadastrado Duas vezes (A não ser em branco)...
> > > Ela funciona normalmento no update e no insert,
> mas
> > > no update só funciona se
> > > eu colocar no where a primary key da tabela...
> > > Quando eu tento atualizar a tabela geral (sem
> > > where), a query trava !
> > > Alguém tem alguma idéia...
> > > o campo cpf é varchar(11) indexado ...
> > >
> > > A Trigger :
> > >
> > > candidato_cpf_up BEFORE UPDATE ON
> public.candidato
> > > FOR EACH ROW EXECUTE
> > > PROCEDURE public.const_cpf_update();
> > >
> > > A Funcao :
> > >
> > > DECLARE
> > > ncpf varchar;
> > > id_cand integer;
> > > res RECORD;
> > > BEGIN
> > > IF NEW.cpf != OLD.cpf THEN
> > > ncpf:=NEW.cpf;
> > > id_cand:=OLD.id_candidato ;
> > > IF ncpf != '' AND NOT ncpf IS NULL THEN
> > > SELECT INTO res COUNT(cpf) as num_cpf
> FROM
> > > candidato WHERE cpf =
> > > ncpf AND id_candidato != id_cand;
> > > IF res.num_cpf > 0 THEN
> > > RAISE EXCEPTION 'CPF ja cadastrado
> > > %',ncpf;
> > > ELSE
> > > RETURN NEW;
> > > END IF;
> > > ELSE
> > > RETURN NEW;
> > > END IF;
> > > ELSE
> > > RETURN NEW;
> > > END IF;
> > > END;
> > >
> > >
> > > Bom é isso ai !!
> > >
> > > Vlw Lista...
> > >
> > > Thiago Risso
> > > Web Developer
> >
> >
> > Thiago, tomei a liberdade de modificar o corpo de
> sua
> > função. Não precisava do AND dentro do WHERE já
> que o
> > IF garante que o select não é executado quando o
> novo
> > cpf é igual ao antigo.
> >
> > Da uma olhada, testa e retorna se deu certo.
> > DECLARE
> > res RECORD;
> > BEGIN
> > IF (NEW.cpf != OLD.cpf) AND (NEW.cpf != '')
> AND
> > (NEW.cpf IS NOT NULL) THEN
> > SELECT INTO res
> > COUNT(*) as num_cpf
> > FROM
> > candidato
> > WHERE
> > cpf = NEW.cpf;
> > IF res.num_cpf > 0 THEN
> > RAISE EXCEPTION 'CPF ja cadastrado
> > %',NEW.cpf;
> > END IF;
> > END IF;
> > RETURN NEW;
> > END;
> >
> >
> >
> >
>
O que você chama de update geral? Em todos os
registros? Quantos registros tem essa sua tabela? Se
tiver muitos e só trava nesse update geral
provavelmente não está travado, eh so o update que
demora mesmo.
_______________________________________________________
Novidade no Yahoo! Mail: receba alertas de novas mensagens no seu celular. Registre seu aparelho agora!
http://br.mobile.yahoo.com/mailalertas/
_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
http://www.postgresql.org.br
>_______________________________________________
>Grupo de Usuários do PostgreSQL no Brasil
>http://www.postgresql.org.br
Datas e horários dos 64 jogos da Copa. Acompanhe aqui! Acompanhe aqui!
_______________________________________________ Grupo de Usuários do PostgreSQL no Brasil http://www.postgresql.org.br
