pq nao poe o campo com uma constraint unique?
----- Original Message -----
Sent: Tuesday, June 20, 2006 7:53 AM
Subject: Re: [PostgreSQL-Brasil] Trigger

O EXPLAIN DA QUERY :

 QUERY PLAN                                                         
 -------------------------------------------------------------------
 Seq Scan on candidato  (cost=0.00..17046.08 rows=139108 width=1009)


On 6/20/06, Thiago Risso <[EMAIL PROTECTED]> wrote:

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;



_______________________________________________________
Abra sua conta no Yahoo! Mail: 1GB de espaço, alertas de e-mail no celular e anti-spam realmente eficaz.
http://mail.yahoo.com.br/
_______________________________________________
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
_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
http://www.postgresql.org.br

Responder a