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
