0

일정에 따라 매일 백업 프로 시저 (프로덕션)가 실행되고 생성 된 백업이 하위 환경을 새로 고치는 데 주기적으로 사용됩니다. 낮은 환경 (다른 서버)으로 .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; 

------------------------------------------------------------------------------------------------------------------- 

답변

2

"내부 활성화"를 사용하여 트리거가 발생합니다. 메시지가 큐에 들어가고 큐에서 읽은 다음 작업을 수행 할 때 트리거되는 저장 프로 시저를 만들어야합니다. 는 link에서 적응 :

CREATE PROCEDURE TargetActivProc 
AS 
    DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER; 
    DECLARE @RecvReqMsg NVARCHAR(100); 
    DECLARE @RecvReqMsgName sysname; 

    WHILE (1=1) 
    BEGIN 

    BEGIN TRANSACTION; 

    WAITFOR 
    (RECEIVE TOP(1) 
     @RecvReqDlgHandle = conversation_handle, 
     @RecvReqMsg = message_body, 
     @RecvReqMsgName = message_type_name 
     FROM TargetQueueIntAct 
    ), TIMEOUT 5000; 

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

    IF @RecvReqMsgName = 
     N'//SBTest/SBSample/RequestMessage' 
    BEGIN 

     --do work here 
    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 
GO 

다음 부분은 큐

ALTER QUEUE SBTargetQueue 
    WITH ACTIVATION 
    (STATUS = ON, 
     PROCEDURE_NAME = TargetActivProc, 
     MAX_QUEUE_READERS = 1, 
     EXECUTE AS SELF 
    ); 

메시지가 큐에 도착하고 활성화 상태로 유지되고 때까지 반복 할 때 절차가 활성화됩니다에 활성화를 활성화하는 것입니다 대기열이 비어 있습니다.

+0

리처드 커플 대기열이 비어있는 경우 잠시 동안 다시 트리거됩니까? 대기열의 새 메시지가이를 트리거합니까? – TharunRaja

+0

@TharunRaja 맞습니다. 대기열에 메시지가있는 한 SQL Server는 활성화 된 프로세스 수가

+0

난 대기열 스크립트를 변경하려고 시도하고 그것에 더미 테이블에 삽입 않습니다 몇 가지 임의의 프로 시저 이름을 첨부했다. 가끔 큐에 메시지가있을 때 큐에 첨부 된 프로 시저가 실행되는 것을 볼 수 있으며 때로는 실행되는 것을 보지 못합니다. MAX_QUEUE_READERS 옵션 및 대기열에있는 메시지 수는 어떻게 되나요? 귀하의 답변은 서비스 브로커를 이해하는데 많은 도움이되었습니다. 고맙습니다. – TharunRaja

관련 문제