none
Erro muito básico, mais não está funcionando RRS feed

  • Pergunta

  • A seguinte trigger seria para verificar se o cnpj inserido tem 14 digitos, porém só funciona da seguinte maneira

    Insert 13 dígito - trigger bloqueia,

    Insert 14 dígito - trigger bloqueia,

    Insert 15 dígito - passa

    Insert 16 dígito - trigger bloqueia,

    A tebela é a seguinte

    CREATE TABLE PessoaJuridica(
    	IdPessoa int NOT NULL,
    	CNPJ bigint NOT NULL
    )

    Trigger

    CREATE TRIGGER VALIDA_CNPJ ON PessoaJuridica FOR INSERT,UPDATE
    AS 
    BEGIN
    
    	SET NOCOUNT ON;
    	
    	DECLARE @CNPJ BIGINT
    	
    	SELECT @CNPJ = CNPJ FROM INSERTED
    
    	IF(LEN(@CNPJ)<14 OR LEN(@CNPJ)>14)
    		BEGIN
    			PRINT 'CNPJ INVALÍDO. DEVE SER OBRIGATÓRIO 14 DÍGITOS'						
    			ROLLBACK TRANSACTION
    		END
    END

    Uma coisa que percebi é que quando o CNPJ inserido começa com zero da esse erro caso contrário funciona normalmente.

    Existe um jeito de corrigir isso ou essa seria msm a melhor manieta de conferir os dígitos do CNPJ


    domingo, 15 de outubro de 2017 18:38

Respostas

  • Luciano,

    não é porque o campo armazena números que ele precisa ser numérico (bigint, int ou outros).

    Como o CNPJ pode iniciar com 0(zero) uma forma mais simples é armazená-lo como string (char ou varchar) para você não precisar de criar fórmulas ou regras no momento da consulta e não será tão simples você validar o cnpj pela quantidade de caracter se você manter o campo como bigint.

    Mas pode fazer com base nesse link:

    https://sqlfromhell.wordpress.com/2009/11/28/valores-numericos-cpf-e-cnpj/


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)




    domingo, 15 de outubro de 2017 19:57
  • Deleted
    domingo, 15 de outubro de 2017 20:24
  • Veja os detalhes nesse link então.

    https://sqlfromhell.wordpress.com/2009/11/28/valores-numericos-cpf-e-cnpj/


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    domingo, 15 de outubro de 2017 20:11
  • Deleted
    domingo, 15 de outubro de 2017 20:43
  • Só mais uma dúvida, teria como no caso eu verificar a duplicidade de campos não chave?

    Por exemplo ao tentar inserir um CNPJ, verificar na tabela se já existi um igual e abortar o insert

    Ou voce pode criar um índice único depois de ja ter criado a tabela.

    CREATE UNIQUE INDEX IX_CNPJ 
        ON dbo.PessoaJuridica(CNPJ);


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    domingo, 15 de outubro de 2017 20:51
  • Você pode usar trigger instead of?

    Segue o exemplo:

    alter TRIGGER [dbo].[TG_VERIFICA_CPF_INSERIDO] ON
    [dbo].[PessoaFisica]
    instead of INSERT,UPDATE 
    AS
    BEGIN
    	
    	DECLARE @CPF BIGINT
    
    	SELECT @CPF = CPF FROM INSERTED
    
    	IF EXISTS (SELECT * FROM PessoaFisica WHERE CPF = @CPF)
    		BEGIN
    			PRINT 'IMPOSSÍVEL INSERIR.JÁ EXISTE O CPF CADASTRADO'
    			ROLLBACK TRANSACTION
    		END
    		else 
    			insert into pessoafisica (cpf) values (@cpf)
    END


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    domingo, 15 de outubro de 2017 21:39

Todas as Respostas

  • Olá,

    altere o tipo do campo e da variável cnpj.

    Segue código:

    	IdPessoa int NOT NULL,
    	CNPJ char(15) NOT NULL
    )
    -- Trigger
    
    CREATE TRIGGER VALIDA_CNPJ ON PessoaJuridica FOR INSERT,UPDATE
    AS 
    BEGIN
    
    	SET NOCOUNT ON;
    	
    	DECLARE @CNPJ char(15)
    	
    	SELECT @CNPJ = CNPJ FROM INSERTED
    
    	IF(LEN(@CNPJ)<>14)
    		BEGIN
    			PRINT 'CNPJ INVALÍDO. DEVE SER OBRIGATÓRIO 14 DÍGITOS'						
    			ROLLBACK TRANSACTION
    		END
    END


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)


    domingo, 15 de outubro de 2017 19:33
  • Não posso alterar, o campo precisa ser bigint. Essa é maneira correta de contar um campo numérico
    domingo, 15 de outubro de 2017 19:50
  • Luciano,

    não é porque o campo armazena números que ele precisa ser numérico (bigint, int ou outros).

    Como o CNPJ pode iniciar com 0(zero) uma forma mais simples é armazená-lo como string (char ou varchar) para você não precisar de criar fórmulas ou regras no momento da consulta e não será tão simples você validar o cnpj pela quantidade de caracter se você manter o campo como bigint.

    Mas pode fazer com base nesse link:

    https://sqlfromhell.wordpress.com/2009/11/28/valores-numericos-cpf-e-cnpj/


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)




    domingo, 15 de outubro de 2017 19:57
  • Entendi como é, só que aqui no caso é um trabalho onde não posso alterar nada do banco, apenas criar Triggers, Store Procedures e Functions que mantenha a integridade.
    domingo, 15 de outubro de 2017 20:08
  • Veja os detalhes nesse link então.

    https://sqlfromhell.wordpress.com/2009/11/28/valores-numericos-cpf-e-cnpj/


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    domingo, 15 de outubro de 2017 20:11
  • Deleted
    domingo, 15 de outubro de 2017 20:24
  • Só mais uma dúvida, teria como no caso eu verificar a duplicidade de campos não chave?

    Por exemplo ao tentar inserir um CNPJ, verificar na tabela se já existi um igual e abortar o insert

    domingo, 15 de outubro de 2017 20:34
  • Deleted
    domingo, 15 de outubro de 2017 20:43
  • Só mais uma dúvida, teria como no caso eu verificar a duplicidade de campos não chave?

    Por exemplo ao tentar inserir um CNPJ, verificar na tabela se já existi um igual e abortar o insert

    Ou voce pode criar um índice único depois de ja ter criado a tabela.

    CREATE UNIQUE INDEX IX_CNPJ 
        ON dbo.PessoaJuridica(CNPJ);


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    domingo, 15 de outubro de 2017 20:51
  • Por trigger teria como? pois nesse trabalho, só posso usar Trigger, Procedure ou function
    domingo, 15 de outubro de 2017 20:59
  • Sim, mas não é a melhor abordagem.

    if exists (select 1 from pessoaJuridica where CNPJ = @CNPJ)
    begin
       rollback;
       raiserror (blablaa)
    end


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    domingo, 15 de outubro de 2017 21:05
  • ALTER TRIGGER [dbo].[TG_VERIFICA_CPF_INSERIDO] ON
    [dbo].[PessoaFisica]
    AFTER INSERT,UPDATE 
    AS
    BEGIN
    	
    	DECLARE @CPF BIGINT
    
    	SELECT @CPF = CPF FROM INSERTED
    
    	IF EXISTS (SELECT * FROM PessoaFisica WHERE CPF = @CPF)
    		BEGIN
    			PRINT 'IMPOSSÍVEL INSERIR.JÁ EXISTE O CPF CADASTRADO'
    			ROLLBACK TRANSACTION
    		END
    END

    Fiz assim mais não está permitindo fazer nenhum insert, mesmo a tabela estando sem nenhum registro
    domingo, 15 de outubro de 2017 21:26
  • Você pode usar trigger instead of?

    Segue o exemplo:

    alter TRIGGER [dbo].[TG_VERIFICA_CPF_INSERIDO] ON
    [dbo].[PessoaFisica]
    instead of INSERT,UPDATE 
    AS
    BEGIN
    	
    	DECLARE @CPF BIGINT
    
    	SELECT @CPF = CPF FROM INSERTED
    
    	IF EXISTS (SELECT * FROM PessoaFisica WHERE CPF = @CPF)
    		BEGIN
    			PRINT 'IMPOSSÍVEL INSERIR.JÁ EXISTE O CPF CADASTRADO'
    			ROLLBACK TRANSACTION
    		END
    		else 
    			insert into pessoafisica (cpf) values (@cpf)
    END


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    domingo, 15 de outubro de 2017 21:39
  • Funcionou vlw, muito obrigado
    domingo, 15 de outubro de 2017 22:34