Por favor, estou precisando de ajuda para adequar este arquivo de script em SQL, de forma a tratar as exceções e informar o usuário sobre o andamento das operações executadas por ele.
O primeiro problema é que o parse está reclamando do escopo das variáveis quando declaradas fora de uma seção BEGIN TRY / BEGIN CATCH.
O segundo problema é a declaração da criação de uma stored procedure / trigger dentro desta seção BEGIN TRY / BEGIN CATCH. O parse me obriga a transferir este código para fora da seção, por que ?
Imaginem que o problema esteja dividido em múltiplos arquivos, cada qual responsável por uma ou mais tarefas semelhantes e sendo que estes arquivos devem ser executados na sequência devido a questões de dependência entre objetos. Por isso enviei apenas este arquivo de exemplo, mas os problemas aparecem para outros arquivos semelhantes.
Segue abaixo o código do arquivo:
/**************************************************/
-- << DEFINE O BANCO DE DADOS >> --
USE NOME_BANCO;
PRINT 'Script: BL001_BD_0500_STORED_PROCEDURES'
PRINT ''
/**************************************************/
--
/**************************************************/
-- << MONITORA A EXECUÇÃO DO SCRIPT >> --
--OBTÉM O IDENTIFICADOR E IMCREMENTA A EXECUÇÃO
--
DECLARE
@NUM_IDENT INT,
@NOME_PROJETO VARCHAR(50)
SET @NOME_PROJETO = ''
SELECT @NUM_IDENT = ISNULL(MAX(NUM_IDENT),0) FROM DICMONITOR
WHERE PROJETO = @NOME_PROJETO AND SCRIPT = 'BL001_BD_0500_STORED_PROCEDURES' AND
CONVERT(CHAR, DATA_EXEC, 103) = CONVERT(CHAR, GETDATE(), 103)
SET @NUM_IDENT = @NUM_IDENT + 1
--REGISTRA A EXECUÇÃO DO SCRIPT
--
IF EXISTS(SELECT 1 FROM SYS.OBJECTS WHERE TYPE = 'U' AND NAME = 'DICMONITOR')
INSERT INTO DICMONITOR(PROJETO,DATA_EXEC,NUM_IDENT,SCRIPT,STATUS,MENSAGEM,HORA_INI,HORA_FIM,LASTUPDATE,USERNAME)
VALUES(@NOME_PROJETO,GETDATE(), @NUM_IDENT,'BL001_BD_0500_STORED_PROCEDURES','INICIO','',GETDATE(),NULL,GETDATE(),CURRENT_USER)
/**************************************************/
--
/*
-- =====================================================================
-- Author.....:
-- Create date: 99/99/99
--
-- Object.....: [PROC001] Procedurename
-- Description: O bloco BEGIN TRY abaixo é responsável pela criação do
-- objeto STORED PROCEDURE. Em caso de erro por qualquer
-- motivo, toda a transação será cancelada e o erro reportado
-- e registrado.
--
-- Comments...:
-- =====================================================================
*/
DECLARE
@OBJ_TIPO VARCHAR(10), -- [C] CHECK constraint, [F] FOREIGN KEY constraint,
-- [PK] PRIMARY KEY constraint, [P] SQL stored procedure,
-- [U] Table (user-defined), [UQ] UNIQUE constraint,
-- [V] View, [TR] SQL_TRIGGER
@OBJ_PROC VARCHAR(40),
@OBJ_NOME_1 VARCHAR(40),
@OBJ_NOME_2 VARCHAR(40),
@OBJ_CAMPO VARCHAR(40),
@MSG_ERRO VARCHAR(400),
@TRATA_ERRO INT, -- [0] NÃO TRATA ERRO , [1] TRATA O ERRO
@CONTINUA_EXEC INT -- [0] NÃO CONTINUA A EXEC. , [1] CONTINUA A EXECUÇÃO
/*
-- =====================================================================
-- Auditoria:
--
-- 1) Verifica a existência das tabelas/views necessárias.
-- =====================================================================
*/
-- INICIALIZA OS NOMES DOS OBJETOS DEPENDENTES
SET @OBJ_PROC = ''
SET @OBJ_NOME_1 = ''
SET @OBJ_NOME_2 = ''
SET @OBJ_CAMPO = ''
SET @OBJ_TIPO = 'U'
IF NOT EXISTS(SELECT 1 FROM SYS.OBJECTS WHERE TYPE = @OBJ_TIPO AND NAME IN (@OBJ_NOME_1, @OBJ_NOME_2))
BEGIN
SET @MSG_ERRO = 'MESSAGE=Algum objeto referenciado nas procedures criadas não foi localizado e o script será interrompido !'
PRINT @MSG_ERRO
RETURN
END
ELSE
BEGIN
SET @MSG_ERRO = 'MESSAGE=Todos os objetos referenciados nas procedures estão disponíveis para uso !'
PRINT @MSG_ERRO
END
BEGIN TRY
-- INICIA A TRANSAÇÃO E DEFINE O TRATAMENTO DE ERROS E A CONTINUIDADE NO SCRIPT...
SET XACT_ABORT OFF;
BEGIN TRAN
SET @TRATA_ERRO = 1
SET @CONTINUA_EXEC = 1
-- INÍCIO DE EXECUÇÃO DAS OPERAÇÕES...
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
SET ANSI_PADDING ON
-- =============================================
-- Author.....:
-- Create date: 99/99/99
-- Description:
-- =============================================
CREATE PROCEDURE [dbo].[SP_NOME_PROCEDURE]
(
@PARAMETRO INT
)
AS
BEGIN
DECLARE
@VARIAVEL INT
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Executa as operações
END
SET ANSI_NULLS OFF
SET QUOTED_IDENTIFIER OFF
SET ANSI_PADDING OFF
-- FINALIZA A TRANSAÇÃO ATUAL...
COMMIT TRAN
PRINT 'MESSAGE=A transação atual foi concluída com sucesso !'
END TRY
BEGIN CATCH
--REGISTRA A EXECUÇÃO DO SCRIPT
--
IF EXISTS(SELECT 1 FROM SYS.OBJECTS WHERE TYPE = 'U' AND NAME = 'DICMONITOR')
UPDATE DICMONITOR
SET
HORA_FIM = GETDATE(),
STATUS = 'ERRO',
MENSAGEM = ERROR_MESSAGE(),
LASTUPDATE = GETDATE()
WHERE
PROJETO = @NOME_PROJETO AND
SCRIPT = 'BL001_BD_0500_STORED_PROCEDURES' AND
NUM_IDENT = @NUM_IDENT
-- CHAMA A PROCEDURE QUE CAPTURA E EXIBE O ERRO OCORRIDO...
IF OBJECT_ID ('usp_GetErrorInfo', 'P') IS NOT NULL
EXECUTE usp_GetErrorInfo
ELSE
BEGIN
-- EXIBE AS INFORMAÇÕES SOBRE O ERRO (SE NECESSÁRIO, DESABILITAR)
PRINT 'Informações sobre o erro ocorrido'
PRINT ' ErrorMessage..:' + CONVERT(VARCHAR, ERROR_MESSAGE())
PRINT ' ErrorNumber...:' + CONVERT(VARCHAR, ISNULL(ERROR_NUMBER(),0))
PRINT ' ErrorSeverity.:' + CONVERT(VARCHAR, ISNULL(ERROR_SEVERITY(),0))
PRINT ' ErrorState....:' + CONVERT(VARCHAR, ISNULL(ERROR_STATE(),0))
PRINT ' ErrorProcedure:' + CONVERT(VARCHAR, ISNULL(ERROR_PROCEDURE(),0))
PRINT ' ErrorLine.....:' + CONVERT(VARCHAR, ISNULL(ERROR_LINE(),0))
PRINT ''
END
-- MSG PADRÃO P/ O FRAMEWORK
SET @MSG_ERRO = 'MESSAGE=' + ERROR_MESSAGE()
RAISERROR 20001 @MSG_ERRO
-- SE NECESSÁRIO, CANCELA A TRANSAÇÃO...
IF(@TRATA_ERRO = 1)
BEGIN
IF( (XACT_STATE()) = -1 ) ROLLBACK TRAN
PRINT 'MESSAGE=A transação atual foi cancelada !'
END
ELSE
BEGIN
IF( (XACT_STATE()) = 1 ) COMMIT TRAN
PRINT 'MESSAGE=Apesar do erro, a transação atual foi confirmada !'
END
-- SE NECESSÁRIO, SAI DO SCRIPT VIA RETURN OU CONTINUA A EXECUÇÃO DAS OPERAÇÕES LOGO APÓS O END CATCH...
IF(@CONTINUA_EXEC = 0)
BEGIN
SET @MSG_ERRO = 'MESSAGE=O fluxo atual do script será interrompido !'
PRINT @MSG_ERRO
RETURN
END
ELSE
BEGIN
SET @MSG_ERRO = 'MESSAGE=O fluxo atual do script continuará !'
PRINT @MSG_ERRO
END
END CATCH;
/*
-- =====================================================================
-- Auditoria:
--
-- 1) Verifica a criação do objeto;
--
-- =====================================================================
*/
-- INICIALIZA OS NOMES DOS OBJETOS DEPENDENTES
SET @OBJ_PROC = ''
SET @OBJ_CAMPO = ''
SET @OBJ_TIPO = 'P'
IF EXISTS(SELECT 1 FROM SYS.OBJECTS WHERE TYPE = @OBJ_TIPO AND NAME = @OBJ_PROC)
BEGIN
SET @MSG_ERRO = 'MESSAGE=O objeto ' + @OBJ_PROC + ' não foi criado e o script será interrompido !'
PRINT @MSG_ERRO
RETURN
END
ELSE
BEGIN
SET @MSG_ERRO = 'MESSAGE=O objeto ' + @OBJ_PROC + ' foi criado com sucesso !'
PRINT @MSG_ERRO
END
--REGISTRA A EXECUÇÃO DO SCRIPT
--
IF EXISTS(SELECT 1 FROM SYS.OBJECTS WHERE TYPE = 'U' AND NAME = 'DICMONITOR')
UPDATE DICMONITOR
SET
HORA_FIM = GETDATE(),
STATUS = 'TERMINO',
MENSAGEM = '',
LASTUPDATE = GETDATE()
WHERE
PROJETO = @NOME_PROJETO AND
SCRIPT = 'BL001_BD_0500_STORED_PROCEDURES' AND
NUM_IDENT = @NUM_IDENT
GO
Pergunta
Guest Jefferson Alves
Boa tarde pessoal,
Por favor, estou precisando de ajuda para adequar este arquivo de script em SQL, de forma a tratar as exceções e informar o usuário sobre o andamento das operações executadas por ele.
O primeiro problema é que o parse está reclamando do escopo das variáveis quando declaradas fora de uma seção BEGIN TRY / BEGIN CATCH.
O segundo problema é a declaração da criação de uma stored procedure / trigger dentro desta seção BEGIN TRY / BEGIN CATCH. O parse me obriga a transferir este código para fora da seção, por que ?
Imaginem que o problema esteja dividido em múltiplos arquivos, cada qual responsável por uma ou mais tarefas semelhantes e sendo que estes arquivos devem ser executados na sequência devido a questões de dependência entre objetos. Por isso enviei apenas este arquivo de exemplo, mas os problemas aparecem para outros arquivos semelhantes.
Segue abaixo o código do arquivo:
Link para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.