2017-02-03 43 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