SQL Server Service Broker无法正常工作

时间:2018-11-06 19:00:58

标签: sql-server

我在数据库中实现了Service Broker功能,并且Configuration运行正常。但是,当我在基表中插入4行时,触发器仅被调用一次,而不是四次。这对我来说很不正常,有时不会在表中插入任何数据。

触发代码为

CREATE   TRIGGER [dbo].[trg_Insert_BaseTable]
 ON [dbo].[BaseTable]
 FOR INSERT
 AS BEGIN
        DECLARE @InitDlgHandle AS UNIQUEIDENTIFIER;

        BEGIN TRANSACTION;
       BEGIN DIALOG @InitDlgHandle
            FROM SERVICE [InitiatorService]
            TO SERVICE N'TargetService'
            ON CONTRACT [SampleContract]
            WITH ENCRYPTION = OFF;

        -- Send a message on the conversation           
        SEND ON CONVERSATION (@InitDlgHandle) MESSAGE TYPE [RequestMessage];
       COMMIT TRANSACTION;
    END

激活SP代码为

WHILE (1 = 1)
 BEGIN
     BEGIN TRANSACTION;
     WAITFOR (RECEIVE TOP (1) @RecvReqDlgHandle = conversation_handle, @RecvReqMsg = message_body, @RecvReqMsgName = message_type_name FROM TargetQueue),  TIMEOUT 5000;
     IF (@@ROWCOUNT = 0)
         BEGIN
             ROLLBACK;
             BREAK;
         END
     IF @RecvReqMsgName = N'RequestMessage'
         BEGIN
            INSERT INTO [dbo].[MyTable]
       ([MySSN]
       ,[MyName]
       ,[MyEmail]
       ,[MyInt])
 VALUES
       (1234567890
       ,'Steve Jones'
       ,'SomeSteve@SomeDomain.com'
       ,10
       )
        END CONVERSATION @RecvReqDlgHandle;
     END
     ELSE
         IF @RecvReqMsgName = N'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
             BEGIN
                 END CONVERSATION @RecvReqDlgHandle;
             END
         ELSE
             IF @RecvReqMsgName = N'http://schemas.microsoft.com/SQL/ServiceBroker/Error'
                 BEGIN
                     END CONVERSATION @RecvReqDlgHandle;
                 END
     COMMIT TRANSACTION;
 END

此sp绑定到“服务和触发器”发送消息到队列。对于基表中的每一行插入,应使用此SP在新表中插入新行。我在链接https://blogs.msdn.microsoft.com/sqlcat/2017/10/19/using-sql-service-broker-for-asynchronous-external-script-r-python-execution-in-oltp-systems/中使用想法,我只想执行一个SP而不是两个SP,并且在触发器中,我不想传递诸如SEND ON CONVERSATION(@InitDlgHandle)之类的消息参数。消息类型[RequestMessage]; 任何即时帮助将不胜感激。

0 个答案:

没有答案
相关问题