Bloquear Insert / Update na Trigger

Firebird

20/12/2006

Pessoal,
Tenho uma tabela onde vou gravando o telefone do cliente tenho dois campos para isso:

    TELEFONE                  VARCHAR(9),
    DDD                       CHAR(2),


O que acontece é que nao posso ter o mesmo telefone cadastrado duas vezes no sistema, nao posso permitir de maneira nenhuma a duplicidade:

Entao gostaria de saber se é possivel fazer este bloqueio usando os recursos do Firebird.
Por exemplo fazendo um Trigger que no momento em que o usuario for cadastrar o novo telefone a Trigger verificar se o mesmo ja foi cadastrado na tabela .. caso sim executar uma Exception caso contrario o usuario grava o registro sem problema.

Agora caso seja possivel fazer atravez do firebird tenho que tomar o cuidado pois a Trigger tem que ferificar sempre no Insert e no Update tambem pois o usuario pode tentar alterar um telefone que ja esteja cadastrado por um novo que ja esteja cadastrado tambem só que em outro cliente.

Estou usando o Firebird 1.5

Se alguem puder ajudar.


Mmoreira

Mmoreira

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

20/12/2006

crie um índice único pelos campos telefone + ddd


GOSTEI 0
Mmoreira

Mmoreira

20/12/2006

Emerson,

Realmente fazendo como voce disse eu resolvi o problema, nao tenho mais que me preocupar com telefones repetidos.

Agora só uma duvida para conhecer um pouco mais os recursos do Firebird. Antes de ver a resposta aqui do post eu tinha feito estas Triggers que tambem impedem que seja gravado numero de telefones repetidos:

Inserir:
CREATE TRIGGER TELEFONE_VALIDA_INSERE FOR CONTATO
ACTIVE BEFORE INSERT POSITION 0
AS
begin

  if (
       EXISTS(
                 select  ID_CONTATO
                   from  CONTATO
                  where  (TELEFONE = NEW.TELEFONE) and 
                             (DDD = NEW.DDD) and
                             (DDI = NEW.DDI)
             )
     ) then exception telefone_existe;

end



Atualizar:
CREATE TRIGGER TELEFONE_VALIDA_ATUALIZA FOR CONTATO
ACTIVE BEFORE UPDATE POSITION 0
AS
begin

  if ((new.DDI <> old.DDI) or (new.DDD <> old.DDD) or (new.TELEFONE <> old.TELEFONE)) then begin

    if (
         EXISTS(
                   select  ID_CONTATO
                     from  CONTATO
                    where  (TELEFONE = NEW.TELEFONE) and
                           (DDD = NEW.DDD) and
                           (DDI = new.DDI) and
                           (ID_CONTATO <> old.ID_CONTATO)
               )
       ) then exception telefone_existe;

  end

end



Estava testando estas duas Trigger e o que acontece é que quando o tento cadastrar um numero de telefone ja existente a mensagem da exception nao é exibida.

* O que eu devo fazer para exibir a mensagem da exception?


GOSTEI 0
POSTAR