我在数据库中实现了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]; 任何即时帮助将不胜感激。