Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

daianyyy

Trigger para validar Cpf

Recommended Posts

Olá pessoal ..tenho uma function que valida cpf ...mas eu gostaria de fazer essa validação com trigger ...será que tem como ???Se tem como faço pra chamar minha função na trigger ...ou de outra maneira ..sei lá...só quero que a trigger valide o cpf ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

daianyyy,

 

Vamos se entedi o que você quer.

 

Você quer quando da inclusão uma trigger valide o cpf que esta sendo incluído ou laterado? Isso?

 

E ser for inválido? Faça o que?

 

Como você esta efetuando a inclusão/alteração: sotred procedure ou expressão sql.

 

Qual a versão do SQL você esta usando?

 

Voce poderia descrever com mais detalhes como é feito este processo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tah, explicando melhor ...faço a validaçao do cpf e a inclusão dos dados na minha aplicação ...mas como eu tenho uma opçao de importar dados para o banco de arquivos xml ...preciso validar esses dados diretamente no banco tbm ....quero que a trigger me retorne uma mensagem de erro ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta trigger seria disparada tanto no INSERT quanto no UPDATE?

 

Esta importação é feita como? Stored procedure ou DTS?

 

Pelo que entedi você quer que durante a importação a trigger valide o cpf e ignore este registro.

E quer tambem saber quais os registro foram invalidadados?

 

Na verdade a trigger é tratada como uma transação. você até pode usar o roolbak só que desfaz a transação toda. Não tenho certeza mas pode ser que toda a transação seja cancelada.

 

E trigger são indicadas para procedimentos mais simples:

  • Manter integridade
  • Definir mensagens de erro personalizadas
  • Manter dados desnormalizados
  • Comparar a consistência dos dados

Por favor responda os questinamentos acima pois assim facilita sugerir algo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta trigger seria disparada tanto no INSERT quanto no UPDATE?

- Ela precisa ser disparada somente no insert

Esta importação é feita como? Stored procedure ou DTS?

- dentro da minha aplicação leio um arquivo xml e mando os dados um registro de cada vez para o banco ...entaum não tem o problema do roolbak ..

na função que eu uso pava validar cpf no banco ela já faz isso ...

 

 

 

E trigger são indicadas para procedimentos mais simples:

o caso é que usando a function eu tenho que chamala dentro da minha aplicação e eu não quero fazer isso ...por isso gostaria de fazer com uma trigger ou uma constraint ...mas não sei c tem como fazer ...

 

Segue a função que estou utilizando

ALTER FUNCTION [dbo].[CPF_VALIDO](@CPF VARCHAR(11))
RETURNS CHAR(1)
AS
BEGIN
  DECLARE @INDICE INT,
          @SOMA INT,
          @DIG1 INT,
          @DIG2 INT,
          @CPF_TEMP VARCHAR(11),
          @DIGITOS_IGUAIS CHAR(1),
          @RESULTADO CHAR(1)
          
  SET @RESULTADO = 'N'

  /*
      Verificando se os digitos são iguais
      A Principio CPF com todos o números iguais são Inválidos
      apesar de validar o Calculo do digito verificado
      EX: O CPF 00000000000 é inválido, mas pelo calculo
      Validaria
  */

  SET @CPF_TEMP = SUBSTRING(@CPF,1,1)

  SET @INDICE = 1
  SET @DIGITOS_IGUAIS = 'S'

  WHILE (@INDICE <= 11)
  BEGIN
    IF SUBSTRING(@CPF,@INDICE,1) <> @CPF_TEMP
      SET @DIGITOS_IGUAIS = 'N'
    SET @INDICE = @INDICE + 1
  END;

  --Caso os digitos não sejão todos iguais Começo o calculo do digitos
  IF @DIGITOS_IGUAIS = 'N' 
  BEGIN
    --Cálculo do 1º dígito
    SET @SOMA = 0
    SET @INDICE = 1
    WHILE (@INDICE <= 9)
    BEGIN
      SET @Soma = @Soma + CONVERT(INT,SUBSTRING(@CPF,@INDICE,1)) * (11 - @INDICE);
      SET @INDICE = @INDICE + 1
    END

    SET @DIG1 = 11 - (@SOMA % 11)

    IF @DIG1 > 9
      SET @DIG1 = 0;

    -- Cálculo do 2º dígito }
    SET @SOMA = 0
    SET @INDICE = 1
    WHILE (@INDICE <= 10)
    BEGIN
      SET @Soma = @Soma + CONVERT(INT,SUBSTRING(@CPF,@INDICE,1)) * (12 - @INDICE);
      SET @INDICE = @INDICE + 1
    END

    SET @DIG2 = 11 - (@SOMA % 11)

    IF @DIG2 > 9
      SET @DIG2 = 0;

    -- Validando
    IF (@DIG1 = SUBSTRING(@CPF,LEN(@CPF)-1,1)) AND (@DIG2 = SUBSTRING(@CPF,LEN(@CPF),1))
      SET @RESULTADO = 'S'
    ELSE
      SET @RESULTADO = 'N'
  END
  RETURN @RESULTADO
END 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nunca fiz nada parecido. Sempre usrei triggers para operações que lhe indiquei

 

Porém pelo pouco que sei através de trigger é possivel chamar stored procedure e functions. Mas não sei quanto a questão de performance.

 

E por favor me corrijam se eu estiver falando bobagens.

 

Vou tentar bolar um exemplo e posto mais tarde, claro se conseguir ou não.

 

Só mais uma sugestão poque você não faz a consistência via código na aplicação. Assim você fica desvinculada do banco de dados. Só sugiro isto por que caso você venha a migrar de baco de dados ou usar algum framework de peristência teria de re-escrever todo este procedimento.

 

Ja fui um defensor de colocar as regras de negócio dentro do bd mas hoje depois de sofre mto quando alteraca o bd em uso acho que é melhor ter um camda na aplicação com as regras de negócio.

 

Mas é só um comentário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue um exemplo da criação de uma trigger chamando a função para validar cpf:

 


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER VALIDA_CPF ON TB_TESTE FOR INSERT
AS 
BEGIN

	SET NOCOUNT ON;
	
	DECLARE @CPF CHAR(11)
	
	SELECT @CPF = CPF FROM INSERTED

	IF DBO.CPF_VALIDO(@CPF) = 'N'
		BEGIN
			
			ROLLBACK TRANSACTION
		END

END
GO

 

Fiz um teste aqui e se o cpf for invalido não efetua o insert.

 

Agora como não tenho idéia do escopo e ambiente da sua aplicação não sei se vai resolver seu problema.

 

Mas talvez lhe dê pelo menos uma idéia de por onde começar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.