|
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