none
Problemas com BEGIN TRY - BEGIN CATCH RRS feed

  • Pergunta

  • Boa tarde pessoal.

    Preciso dar um INSERT  em 3 tabelas distintas: tblPessoa, tblPessoaFisica e tblCliente. o Problema ocorre na tblPessoaFisica... A tabela possui o campo NomeCompleto que está definido como NOT NULL.

    Em tese, se eu chamar a procedure e não passar um NomeCompleto, estando dentro de um TRY/CATCH e dentro de um bloco de controle de transição, ele deveria não gravar nada na tblPessoa fisica e desfazer a transação (ao menos é isso que eu entendo), só que ele está seguindo e gravando em todas as 3 tabelas, normalmente ignorando o NOT NULL, isto é, os campos definidos como NOT NULL ficam vazios...

    Alguém poderia me ajudar a corrigir esse problema?

    Grande abraço

    CREATE PROCEDURE uspClientePessoaFisicaInserir
    	
    	@IDPessoaSituacao INT,
    	@NomeCompleto VARCHAR(100) = null,
    	@Apelido VARCHAR(30),
    	@IDSexo INT
    	
    
    	
    AS
    BEGIN
    
    	--Consultar IDPessoa no banco e Gerar AutoIncremento
    	DECLARE @IDPessoa AS INT;
    	EXEC uspGerarIDControle 'tblPessoa', 'IDPessoa', @IDPessoa OUTPUT
    
    	IF @IDPessoa != -1
    	BEGIN
    
    		BEGIN TRY
    			BEGIN TRAN
    			
    				--Gravar registro na tabela tblPessoa
    				INSERT INTO tblPessoa
    				(
    					IDPessoa,
    					IDPessoaTipo,
    					IDPessoaSituacao,
    					DataInclusao
    				 ) 
    				 VALUES
    				 (
    					@IDPessoa,
    					1,
    					@IDPessoaSituacao,
    					GETDATE()
    				 );
    
    		
    				 -- Gravar registro na tabela tblPessoaFisica
    				 INSERT INTO tblPessoaFisica
    				 (
    			 		IDPessoaFisica,
    			 		NomeCompleto,
    			 		Apelido,
    					IDSexo
    			 	
    				 ) VALUES
    				 (
    			 		@IDPessoa,
    			 		@NomeCompleto,
    			 		@Apelido,
    					@IDSexo
    				 );
    			 
    				 -- Gravar registro na tabela tblCliente
    				 INSERT INTO tblCliente
    				 (
    			 		IDCliente
    			 	
    				 ) VALUES
    				 (
    			 		@IDPessoa
    				 );
    			 
    				 SELECT @IDPessoa AS Retorno;
    
    			COMMIT TRAN
    		END TRY
    		BEGIN CATCH
    			ROLLBACK TRAN
    			SELECT ERROR_MESSAGE() AS Retorno;
    		END CATCH
    
    	END
    	ELSE
    	RAISERROR('Não foi possível inserir o registro devido a um erro na geração do ID.', 14, 1);
    	
    	
    
    END

    domingo, 4 de outubro de 2015 19:42

Respostas

  • Boa noite,

    Pelo que vi na imagem a coluna NomeCompleto está em branco e não nula, e nesse caso o Not Null realmente não vai fazer diferença.

    Acredito que para não permitir que o a coluna fique em branco será necessário adicionar código na procedure ou em uma trigger para criar uma exceção quando a coluna estiver em branco. Ex:

    if NomeCompleto = ''
        RAISERROR ('O nome completo não foi preenchido.', 14, 1);
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Marcos SJ segunda-feira, 5 de outubro de 2015 13:19
    domingo, 4 de outubro de 2015 22:37