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

Responder a