일정에 따라 매일 백업 프로 시저 (프로덕션)가 실행되고 생성 된 백업이 하위 환경을 새로 고치는 데 주기적으로 사용됩니다. 낮은 환경 (다른 서버)으로 .bak 파일을 다운로드하는 자동화 된 솔루션을 구축 중입니다. 나는 거울에 무엇인가가 실패 할 경우 정상적인 백업 작업을 수행 할 수 있으므로 미러에서까지 백업 옵션을 사용하기를 꺼립니다. 여기서는 서비스 브로커를 사용하고 백업 절차가 끝날 때 비동기 적으로 파일 사본을 prod에서 낮은 환경으로 트리거하려고합니다. 서비스 브로커, 메시지 유형, 서비스, 대기열 및 계약을 이해하는 데 많은 노력을 기울였습니다. 여기까지는 괜찮습니다. 이제는 서비스 브로커를 사용하여 백업이 끝날 때 사용자 지정 논리를 사용하여 filecopy 절차를 트리거하는 방법을 이해하고 싶습니다. 서비스 브로커를 이해하기 위해 다음 스크립트로 놀아 보았습니다. 누군가가 친절하게도이 문제를 해결하는 방법을 안내해줍니다.SQL Server에서 서비스 브로커를 사용하는 비동기 프로 시저 호출
------------------------------------------------------------SETUP--------------------------------------------
CREATE MESSAGE TYPE [//SBTest/SBSample/RequestMessage] VALIDATION=WELL_FORMED_XML;
CREATE MESSAGE TYPE [//SBTest/SBSample/ReplyMessage] VALIDATION=WELL_FORMED_XML;
-------------------------------------------------------------------------------------------------------------
CREATE CONTRACT [//SBTest/SBSample/SBContract]
(
[//SBTest/SBSample/RequestMessage] SENT BY INITIATOR ,
[//SBTest/SBSample/ReplyMessage] SENT BY TARGET
);
-------------------------------------------------------------------------------------------------------------
CREATE QUEUE SBInitiatorQueue;
CREATE QUEUE SBTargetQueue;
-------------------------------------------------------------------------------------------------------------
CREATE SERVICE [//SBTest/SBSample/SBInitiatorService] ON QUEUE SBInitiatorQueue;
CREATE SERVICE [//SBTest/SBSample/SBTargetService] ON QUEUE SBTargetQueue ([//SBTest/SBSample/SBContract]);
-------------------------------------------------------------------------------------------------------------
-------------------------------------------------------INITIATE QUE-----------------------------------------
DECLARE @InitDlgHandle UNIQUEIDENTIFIER
DECLARE @RequestMessage VARCHAR(1000)
BEGIN TRAN
--Determine the Initiator Service, Target Service and the Contract
BEGIN DIALOG @InitDlgHandle
FROM SERVICE [//SBTest/SBSample/SBInitiatorService] TO SERVICE'//SBTest/SBSample/SBTargetService'
ON CONTRACT
[//SBTest/SBSample/SBContract]
WITH ENCRYPTION=OFF;
--Prepare the Message
SELECT @RequestMessage = N'HAHA';
--Send the Message
SEND ON CONVERSATION @InitDlgHandle
MESSAGE TYPE
[//SBTest/SBSample/RequestMessage]
(@RequestMessage);
SELECT @RequestMessage AS SentRequestMessage;
COMMIT TRAN
---------------------------------------------------------------------------------------------------------------
-------------------------------------------------------READ QUE-------------------------------------------------
\DECLARE @TargetDlgHandle UNIQUEIDENTIFIER
DECLARE @ReplyMessage VARCHAR(1000)
DECLARE @ReplyMessageName Sysname
BEGIN TRAN;
--Receive message from Initiator
RECEIVE TOP(1)
@TargetDlgHandle=Conversation_Handle, @ReplyMessage=Message_Body, @ReplyMessageName=Message_Type_Name
FROM SBTargetQueue;
SELECT @ReplyMessage AS ReceivedRequestMessage;
-- Confirm and Send a reply
IF @ReplyMessageName=N'HAHA'
BEGIN
DECLARE @RplyMsg VARCHAR(1000)
SELECT @RplyMsg =N'HI';
SEND ON CONVERSATION @TargetDlgHandle
MESSAGE TYPE
[//SBTest/SBSample/ReplyMessage]
(@RplyMsg);
END CONVERSATION @TargetDlgHandle;
END
SELECT @RplyMsg AS SentReplyMessage;
COMMIT TRAN;
-------------------------------------------------------------------------------------------------------------------
리처드 커플 대기열이 비어있는 경우 잠시 동안 다시 트리거됩니까? 대기열의 새 메시지가이를 트리거합니까? – TharunRaja
@TharunRaja 맞습니다. 대기열에 메시지가있는 한 SQL Server는 활성화 된 프로세스 수가
난 대기열 스크립트를 변경하려고 시도하고 그것에 더미 테이블에 삽입 않습니다 몇 가지 임의의 프로 시저 이름을 첨부했다. 가끔 큐에 메시지가있을 때 큐에 첨부 된 프로 시저가 실행되는 것을 볼 수 있으며 때로는 실행되는 것을 보지 못합니다. MAX_QUEUE_READERS 옵션 및 대기열에있는 메시지 수는 어떻게 되나요? 귀하의 답변은 서비스 브로커를 이해하는데 많은 도움이되었습니다. 고맙습니다. – TharunRaja