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

Responder a