2016-03-21 6 views
9

से एसएसआईएसडीबी कार्यान्वयन के साथ एसएसआईएस को कॉल करना एसएसआईएस के माध्यम से एक वेब सेवा को कॉल करना और एसएसआईएस को SQL सर्वर सेवा ब्रोकर सक्रिय संग्रहीत प्रक्रिया से कॉल करना है।SQL सर्वर सेवा ब्रोकर

यहाँ मैं वर्तमान में क्या कर रहा है:

कतार

CREATE QUEUE [schema].[ProccessingQueue] WITH STATUS = ON , RETENTION = OFF , ACTIVATION ( STATUS = ON , PROCEDURE_NAME = [schema].[usp_ProccessingQueueActivation] , MAX_QUEUE_READERS = 10 , EXECUTE AS N'dbo' ), POISON_MESSAGE_HANDLING (STATUS = ON) 

मेरे संग्रहीत प्रक्रिया:

ALTER PROCEDURE [schema].[usp_ProccessingQueueActivation] 
WITH EXECUTE AS CALLER 
AS 

BEGIN 
    SET NOCOUNT ON; 

    <snip declaration> 
    BEGIN 
     BEGIN TRANSACTION; 

      WAITFOR 
      (
       RECEIVE TOP (1) 
        @ConversationHandle = conversation_handle, 
        @MessageBody = CAST(message_body AS XML), 
        @MessageTypeName = message_type_name 
       FROM [schema].[ProccessingQueue] 
      ), TIMEOUT 5000; 

      <snip awasome stuff> 
       EXEC dbo.RunSSIS <param> 

       DECLARE @ReplyMessageBody XML = @MessageBody; 
       SEND ON CONVERSATION @ConversationHandle MESSAGE TYPE [type] (@ReplyMessageBody); 
      END 

      <handle error> 

     COMMIT TRANSACTION; 
    END 
END 

अब यहाँ क्या RunSSIS संग्रहीत प्रक्रिया

ALTER PROCEDURE [dbo].[RunSSIS] 
     <params> 
AS 
BEGIN 
     DECLARE @exec_id BIGINT 

     EXEC [SSISDB].[catalog].[create_execution] 
    @package_name=N'<SSIS_package>', 
    @folder_name=N'<folder>', 
    @project_name=N'<projectName>', 
    @use32bitruntime=FALSE, 
    @reference_id=NULL,    
    @[email protected]_id OUTPUT 

     EXEC [SSISDB].[catalog].[set_execution_parameter_value] 
     @exec_id, 
     @object_type=30, 
     @parameter_name=N'<param_Name>', 
     @parameter_value=<param> 

     SELECT @exec_id 

     EXEC [SSISDB].[catalog].[start_execution] @exec_id 
END 
की तरह लग रहा है

अब यह घटना-दर्शक में नीचे दिए गए अपवाद को फेंक देगा क्योंकि एसएसआईएसडीबी पर्यावरण में एसक्यूएल सेवा ब्रोकर सक्रियण सुरक्षा संदर्भ पहचाना नहीं गया है।

सक्रिय proc '[स्कीमा] [usp_ProccessingQueueActivation]।' कतार 'पर चल रहा' आउटपुट निम्नलिखित : 'वर्तमान सुरक्षा संदर्भ को नहीं लौटाया जा सकता है। कृपया मूल डेटाबेस पर स्विच करें जहां 'निष्पादित करें' कहा जाता था और इसे फिर से आजमाएं। '

समस्या मैं उन निम्नलिखित दृष्टिकोण

  • तो मैं इस लिंक http://www.databasejournal.com/features/mssql/article.php/3800181/Security-Context-of-Service-Broker-Internal-Activation.htm का पालन करें और एक आत्म हस्ताक्षरित प्रमाणपत्र के साथ एक उपयोगकर्ता द्वारा निर्मित की कोशिश की है हल करने के लिए (यह सोच कर कि यह उपयोगकर्ता है कि 'नहीं करता है टी की अनुमति है)। लेकिन यह एक ही त्रुटि लौटा रहा है, गहराई से खोदने पर मैंने पाया कि [आंतरिक]। [Ready_execution] में एसएसआईएसडीबी के पास लाइन 36 में "रिवर" कथन है जो त्रुटि को के रूप में फेंकता है, यह प्रतिरूपण पसंद नहीं करता है।

    • मैं SSISDB को RunSSIS संग्रहीत प्रक्रिया के लिए कदम है और यह सक्रियण संग्रहीत प्रक्रिया से कॉल करने के लिए कोशिश करने की कोशिश की, इसे नीचे SSISDB के रूप में यह एसक्यूएल सर्वर प्रमाणन के साथ किसी भी उपयोगकर्ता की अनुमति नहीं है शूट किया गया था, यह एक विंडोज की जरूरत है सर्टिफिकेट द्वारा बनाए गए ऑथ और उपयोगकर्ता में स्पष्ट रूप से विंडोज क्रेडेंशियल नहीं है।

मेरा प्रश्न है

  • मैं सही रास्ते पर हूँ? मैं निश्चित रूप से एसक्यूएल सर्वर के 2 घटक का उपयोग करने की उम्मीद नहीं करता, यह मुश्किल होगा।
  • यदि सही दृष्टिकोण में नहीं है तो सेवा दलाल से सेवा कॉल करने का सबसे अच्छा तरीका क्या होगा? मैंने SQL सर्वर सेवा दलाल के लिए "बाहरी सक्रियण" देखा है लेकिन अभी तक पता नहीं लगाया है। लेकिन मैं सर्वर पर्यावरण और स्केल-सक्षम के अंदर रहने वाली किसी चीज से चिपकने की कोशिश करता हूं, और प्रोड पर्यावरण में विभिन्न घटक स्थापित करने के विचार को पसंद नहीं करता (यह हमेशा व्यक्तिगत समर्थन के लिए ओवरहेड होता है, क्योंकि एक और बिंदु है जो एक और बिंदु है असफल)

मैं विंडोज ऑथ का उपयोग कर रहा हूं और मेरे क्रेडेंशियल में sys_Admin पहुंच है।

+0

यह http://dba.stackexchange.com – stuartd

+0

के लिए बेहतर फिट जैसा दिखता है [सेवा ब्रोकर बाहरी सक्रियकर्ता] (https://blogs.msdn.microsoft.com/sql_service_broker/2009/05/18/get- प्रारंभ-से-उपयोग-बाहरी-सक्रियकर्ता /) –

+0

क्या कोड हस्ताक्षर कार्य करता है? https://msdn.microsoft.com/en-us/library/bb283630.aspx –

उत्तर

0

मुझे लगता है कि आप "कॉल के रूप में विशिष्ट" के साथ बाहर निकल सकते हैं और सबकुछ (proc और फिर पैकेज जो कॉल हो रहा है) सेवा ब्रोकर के सुरक्षा संदर्भ के तहत चलाया जाएगा। जब तक उस संदर्भ में आप जो करना चाहते हैं उसे करने की अनुमति है, तो आपको ठीक होना चाहिए।

मैंने इस तरह से एक सेवा ब्रोकर का उपयोग नहीं किया है, लेकिन मैं SQL एजेंट द्वारा निकाली गई नौकरियों के साथ वही काम करता हूं। जब तक एजेंट के सुरक्षा संदर्भ में procs/packages में आवश्यक अनुमतियां होती हैं, तब तक सब ठीक हो जाता है। हम अपनी सेवाओं के लिए नेटवर्क खाते का उपयोग करते हैं, इसलिए यह सभी सर्वरों के बीच भी काम करता है।

+0

इसका उत्तर देने में बहुत देर हो चुकी है, हमने वास्तव में एसकआईएस -> एसक्यूएल सेवा ब्रोकर से वेबसाइज को बुलाया है और एसक्यूएल सीएलआर रूट के साथ जाता है । कॉल को सुरक्षित करने के लिए, हम अनाम कॉलिंग को अक्षम करते हैं, और विंडोज लॉगिन को मजबूर करते हैं, यह देखते हुए कि यह इंट्रानेट साइट है, और हम उम्मीद करते हैं कि वेबसाइट पर कॉल करने वाले सभी को लॉगिन करना चाहिए, यह काम कर रहा है। लेकिन मैं अभी भी माइक्रोसॉफ्ट से डाटाबेस से एक वास्तविक पुश इवेंट आधारित सिस्टम बनाने के लिए एक मिस्ड अवसर भरता हूं – Sukanta

0

इसमें तंग युग्मन की एक कोड गंध है और मेरी पहली प्रवृत्ति कतार को डीक्यूपल करना है, डीबी जिसमें प्रोसेस है, और एसएसआईएस निष्पादन पावरशेल स्क्रिप्ट में है। स्क्रिप्ट को सेवा ब्रोकर से संदेश प्राप्त करें, फिर संग्रहीत प्रो में [catalog].[create_execution] और [catalog].[set_execution_parameter_value] को लपेटे बिना एसएसआईएसडीबी को एक अलग कनेक्शन पर कॉल करें। आप अभी भी एजेंट से सीधे इस स्क्रिप्ट को चला सकते हैं।

यह दृष्टिकोण आपको सुरक्षा संदर्भों के संबंध में सबसे अधिक लचीलापन देता है, यदि घटक में से कोई एक अलग सर्वर पर जाता है, यदि कुछ dev/QA में अलग-अलग नाम दिया गया है, या प्रौद्योगिकियों में परिवर्तन (उदाहरण के लिए ब्रोकर के बजाय Azure ServiceBus) । आप लॉगिंग/निगरानी के साथ रचनात्मक भी हो सकते हैं।

संबंधित मुद्दे