2017-02-03 45 views
0

我决定将日志记录添加到SQL代理队列的激活存储过程 - 目标是记录错误。经过测试,日志表不断填充错误。SQL代理激活过程日志过多

之前添加日志记录:

  • 一切都很正常
  • 没有一个系统或事件日志说明问题
  • 服务器的性能几乎没有显示 '标志'

AFTER添加日志:
Th E服务器性能仍勉强显示了一个“标志”,但是...

  • 对数表连续地与该服务目前队列“OutboundEventRequestQueue”被禁用以下错误

填充。

  • 记录不会停止,直到我运行下面的命令

    ALTER DATABASE [MyDatabaseName] WITH IMMEDIATE ROLLBACK

存储过程SET NEW_BROKER:

ALTER PROCEDURE [dbo].[usp_OutboundEventRequestQueueActivation] 
AS 
BEGIN 

    SET NOCOUNT ON; 

    DECLARE @ConversationHandle UNIQUEIDENTIFIER; 
    DECLARE @MessageBody XML; 
    DECLARE @MessageTypeName SYSNAME; 

    --------------- 
    -- READS ALL THE MESSAGES IN THE QUEUE 
    --------------- 
    WHILE (1=1) 
    BEGIN 

     BEGIN TRY 
     BEGIN TRANSACTION; 

      --------------- 
      -- KEEPS READING While In 'Notified' State 
      --------------- 
      WAITFOR 
      (
       RECEIVE TOP (1) 
        @ConversationHandle = conversation_handle, 
        @MessageBody = CAST(message_body AS XML), 
        @MessageTypeName = message_type_name 
       FROM [dbo].[OutboundEventRequestQueue] 
      ), TIMEOUT 5000; 

      IF (@@ROWCOUNT = 0) 
      BEGIN 
       ROLLBACK TRANSACTION; 
       BREAK; 
      END 

      --------------- 
      -- HANDLE REPLY MESSAGE: OutboundEventRequest 
      --------------- 
      IF @MessageTypeName = N'OutboundEventRequestMessageType' 
      BEGIN 

       -- DEBUG ONLY: Use to force an error 
       --WAITFOR DELAY '00:00:01' 

       -------------- 
       -- INSERT AUDIT 
       -------------- 
       DECLARE @AuditedEvent XML; 
       EXEC [event].[usp_tOutbound_Audit_UPSERT] @MessageBody, @AuditedEvent = @AuditedEvent OUTPUT 

       --------------- 
       -- DO WORK 
       --------------- 

       -- Publish XML Message (payload) to Outbound Event Aggregator (using SQL CLR) 
       DECLARE @Payload NVARCHAR(MAX) = (SELECT CONVERT(NVARCHAR(MAX), @AuditedEvent)) 
       EXEC dbo.usp_OutboundEventMessage_PUBLISH @outboundEvent = @Payload 

       -- SEND REPLY 
       DECLARE @ReplyMessageBody XML = @MessageBody; 
       SEND ON CONVERSATION @ConversationHandle MESSAGE TYPE [OutboundEventResponseMessageType] (@ReplyMessageBody); 
      END 

      --------------- 
      -- HANDLE ERRORS: for EndDialog MessageTypes 
      --------------- 
      ELSE IF @MessageTypeName = N'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog' 
      BEGIN 

       -- CLOSE CONVERSATION 
       END CONVERSATION @ConversationHandle; 
      END 

      --------------- 
      -- HANDLE ERRORS: for Error MessageTypes 
      --------------- 
      ELSE IF @MessageTypeName = N'http://schemas.microsoft.com/SQL/ServiceBroker/Error' 
      BEGIN 

       -- CLOSE CONVERSATION 
       END CONVERSATION @ConversationHandle; 
      END 

     COMMIT TRANSACTION; 
     END TRY 
     BEGIN CATCH 

      ROLLBACK TRANSACTION; 

      DECLARE @Error_Number INT = (SELECT ERROR_NUMBER()) 
      DECLARE @Error_Message VARCHAR(MAX) = (SELECT ERROR_MESSAGE()) 
      DECLARE @Error_Severity INT = (SELECT ERROR_SEVERITY()) 
      DECLARE @Error_State INT = (SELECT ERROR_STATE()) 
      DECLARE @Error_Procedure VARCHAR(400) = (SELECT ERROR_PROCEDURE()) 
      DECLARE @Error_Line INT = (SELECT ERROR_LINE()) 

      -- HERE: The log-table is continuously FILLING-UP 
      EXEC [event].[usp_Exceptions_TRYINSERT] 
       @Error_Number, 
       @Error_Message, 
       @Error_Severity, 
       @Error_State, 
       @Error_Procedure, 
       @Error_Line 
     END CATCH 
    END 
END 

队:

ALTER QUEUE [dbo].[OutboundEventRequestQueue] WITH STATUS = OFF , RETENTION = OFF , ACTIVATION ( STATUS = ON , PROCEDURE_NAME = [dbo].[usp_OutboundEventRequestQueueActivation] , MAX_QUEUE_READERS = 10 , EXECUTE AS OWNER ), POISON_MESSAGE_HANDLING (STATUS = ON) 

回答

0

好了,现在我觉得自己很蠢。我很惊讶没有人抓住这个......赫克我很惊讶,我没有。

的问题代码:

WHILE(1 = 1)

的CORRECTED存储过程:
这将捕获正确的错误

ALTER PROCEDURE [dbo].[usp_OutboundEventRequestQueueActivation] 
AS 
BEGIN 

    SET NOCOUNT ON; 

    DECLARE @ConversationHandle UNIQUEIDENTIFIER; 
    DECLARE @MessageBody XML; 
    DECLARE @MessageTypeName SYSNAME; 

    DECLARE @RunningState TINYINT = 1; 

    --------------- 
    -- READS ALL THE MESSAGES IN THE QUEUE 
    -------------- 
    WHILE (@RunningState = 1) 
    BEGIN 

     BEGIN TRY 
     BEGIN TRANSACTION; 

      --------------- 
      -- KEEPS READING While In 'Notified' State 
      --------------- 
      WAITFOR 
      (
       RECEIVE TOP (1) 
        @ConversationHandle = conversation_handle, 
        @MessageBody = CAST(message_body AS XML), 
        @MessageTypeName = message_type_name 
       FROM [dbo].[OutboundEventRequestQueue] 
      ), TIMEOUT 5000; 

      IF (@@ROWCOUNT = 0) 
      BEGIN 
       ROLLBACK TRANSACTION; 
       BREAK; 
      END 

      --------------- 
      -- HANDLE REPLY MESSAGE: OutboundEventRequest 
      --------------- 
      IF @MessageTypeName = N'OutboundEventRequestMessageType' 
      BEGIN 

       -- DEBUG ONLY: Use to force an error 
       --WAITFOR DELAY '00:00:01' 

       -------------- 
       -- INSERT AUDIT 
       -------------- 
       DECLARE @AuditedEvent XML; 
       EXEC [event].[usp_tOutbound_Audit_UPSERT] @MessageBody, @AuditedEvent = @AuditedEvent OUTPUT 

       --------------- 
       -- DO WORK 
       --------------- 

       -- Publish XML Message (payload) to Outbound Event Aggregator (using SQL CLR) 
       DECLARE @Payload NVARCHAR(MAX) = (SELECT CONVERT(NVARCHAR(MAX), @AuditedEvent)) 
       EXEC dbo.usp_OutboundEventMessage_PUBLISH @outboundEvent = @Payload 

       -- SEND REPLY 
       DECLARE @ReplyMessageBody XML = @MessageBody; 
       SEND ON CONVERSATION @ConversationHandle MESSAGE TYPE [OutboundEventResponseMessageType] (@ReplyMessageBody); 
      END 

      --------------- 
      -- HANDLE ERRORS: for EndDialog MessageTypes 
      --------------- 
      ELSE IF @MessageTypeName = N'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog' 
      BEGIN 

       -- CLOSE CONVERSATION 
       END CONVERSATION @ConversationHandle; 
      END 

      --------------- 
      -- HANDLE ERRORS: for Error MessageTypes 
      --------------- 
      ELSE IF @MessageTypeName = N'http://schemas.microsoft.com/SQL/ServiceBroker/Error' 
      BEGIN 

       -- CLOSE CONVERSATION 
       END CONVERSATION @ConversationHandle; 
      END 

     COMMIT TRANSACTION; 
     END TRY 
     BEGIN CATCH 

      ROLLBACK TRANSACTION; 

      SET @RunningState = 0; 

      DECLARE @Error_Number INT = (SELECT ERROR_NUMBER()) 
      DECLARE @Error_Message VARCHAR(MAX) = (SELECT ERROR_MESSAGE()) 
      DECLARE @Error_Severity INT = (SELECT ERROR_SEVERITY()) 
      DECLARE @Error_State INT = (SELECT ERROR_STATE()) 
      DECLARE @Error_Procedure VARCHAR(400) = (SELECT ERROR_PROCEDURE()) 
      DECLARE @Error_Line INT = (SELECT ERROR_LINE()) 

      EXEC [event].[usp_Exceptions_TRYINSERT] 
       @Error_Number, 
       @Error_Message, 
       @Error_Severity, 
       @Error_State, 
       @Error_Procedure, 
       @Error_Line 
     END CATCH 
    END 
END