एक गैर- sysadmin डोमेन उपयोगकर्ता के स्वामित्व वाली SQL एजेंट नौकरी से SSIS पैकेज चलाना


15

मेरे पास दो एसएसआईएस पैकेज हैं जो किसी भी मुद्दे के बिना एक बड़े एसएसआईएस तैनाती के हिस्से के रूप में रात भर (एसक्यूएल सर्वर एजेंट के माध्यम से) निर्धारित हैं। सब कुछ विंडोज प्रमाणीकरण का उपयोग कर रहा है, और अनुसूचित नौकरी एक sysadmin (अच्छी तरह से, मेरे) के स्वामित्व में है और SQL सर्वर एजेंट सेवा खाते के रूप में चलती है

तो, डेटा अनिवार्य रूप से source system ~> transit db ~> staging ~> NDSरातोंरात चला जाता है।

डेटा के एक विशिष्ट सेट के लिए क्रमशः दो SSIS पैकेज, जिनकी मैं देखभाल करता हूं transit db ~> stagingऔर staging ~> NDSभागों को संभालता हूं ।

एक डोमेन उपयोगकर्ता (गैर- sysadmin) कुछ ऐसा करता है source systemजो दिलचस्प डेटा को अंदर धकेलता है transit db, इसलिए मुझे काम करने के लिए इस अपडेट किए गए डेटा को अपडेट करने के लिए इस तरीके से लाने का एक तरीका चाहिए NDS: यह निर्णय लिया गया कि इस व्यक्ति को ट्रिगर करने का सबसे सरल तरीका ईटीएल, एक मैक्रो-सक्षम एक्सेल वर्कबुक में एक बटन पर क्लिक करके था, जो ओडीबीसी (विंडोज ऑथेंटिकेशन का उपयोग करके) के माध्यम से SQL सर्वर से कनेक्ट होता है और एक संग्रहीत कार्यविधि को निष्पादित करता है।

संग्रहीत कार्यविधि इस तरह दिखती है:

create procedure dbo.UpdateMaterialInventory
as
begin
    execute msdb.dbo.UpdateMaterialInventory;
end

[Msdb] में "बहन" संग्रहीत कार्यविधि इस प्रकार है:

create procedure dbo.UpdateMaterialInventory
with execute as 'SqlAgentProxy'
as
begin
    execute msdb.dbo.sp_start_job N'NDS-ManualMaterialInventory';
end

यह [SqlAgentProxy] उपयोगकर्ता एक विंडोज़ उपयोगकर्ता है जिसे मैंने डोमेन उपयोगकर्ता के लॉगिन से [msdb] में बनाया था, जिसके लिए मैंने executeइस UpdateMaterialInventoryप्रक्रिया को अनुमति दी थी । यह डोमेन उपयोगकर्ता को executeअनुमति देने से बचता है msdb.dbo.sp_start_job, जो अत्यधिक होगा।

SQL एजेंट नौकरी NDS-ManualMaterialInventoryडोमेन उपयोगकर्ता के स्वामित्व में है और इसमें 2 चरण हैं, प्रत्येक प्रकार [SQL सर्वर एकीकरण सेवा पैकेज], जैसा कि रन के लिए सेट किया गया है SSISProxy

SSISProxySQL सर्वर एजेंट प्रॉक्सी है जिसे क्रेडेंशियल नाम का उपयोग करते हुए [SQL सर्वर एकीकरण सेवा पैकेज] सबसिस्टम में मैप किया जाता है SSISProxyCredentials। डोमेन उपयोगकर्ता का लॉगिन प्रॉक्सी खाता प्रिंसिपलों में जोड़ा गया था ।

SSISProxyCredentialsसाथ बनाए गए थे पहचान पूरे लघु उद्योगों ईटीएल रात भर चल रहा है कि एक ही डोमेन उपयोगकर्ता की, और उसका पासवर्ड चौगुनी-जाँच की थी।

अब, अगर मैं इसे चलाता हूं:

execute as login=N'DOMAIN\thatperson'
exec NDS.dbo.UpdateMaterialInventory;
go

मुझे यह आउटपुट मिलता है:

Job 'NDS-ManualMaterialInventory' started successfully.

हालांकि नौकरी का इतिहास बहुत कम उत्साहजनक कहानी बता रहा है:

The job failed.  The Job was invoked by User DOMAIN\thatperson.
The last step to run was step 1 (Extract).

और चरण 1 विवरण:

Executed as user: {domain user that runs SSIS ETL overnight}.
Microsoft (R) SQL Server Execute Package Utility  Version 12.0.4100.1 for 64-bit
Copyright (C) Microsoft Corporation. All rights reserved.
Started:  2:18:50 PM  Failed to execute IS server package because of error 0x80131904.
Server: {server name}, Package path: \SSISDB\Foo\Bar\foobar.dtsx, Environment reference Id: NULL.
Description: Login failed for user '{domain user that runs SSIS ETL overnight}'.
Source: .Net SqlClient Data Provider 
Started:  2:18:50 PM  Finished: 2:18:51 PM  Elapsed:  0.094 seconds.
The package execution failed.
The step failed.

नौकरी विफल हो जाती है और कुछ भी कहीं भी लॉग इन नहीं होता है।

यदि मैं नौकरी के स्वामी को खुद बदल देता हूं, और SQL सर्वर एजेंट सेवा खाता के रूप में चलाए जाने वाले चरणों को बदल देता हूं, तो नौकरी चलती है, सफल होती है और 1,067 पंक्तियों को [मेटाडेटा] में लॉग करती है। [dbo] [sysssislog]।

ऐसा लगता है कि प्रॉक्सी / क्रेडेंशियल सेट अप करने के तरीके के बारे में कुछ ठीक नहीं है। मैं कौन सा हिस्सा गलत कर रहा हूं?

जवाबों:


17

यह समस्या जितनी जटिल है, उससे कहीं अधिक जटिल है। चूंकि आप एसक्यूएल 2014 का उपयोग कर रहे हैं, इसलिए संभवतः आपको 2012 में शुरू की गई नई सुरक्षा सुविधाओं द्वारा काट दिया जा रहा है।

केवल एक चीज जो वास्तव में मायने रखती है:

Server: {server name}, Package path: \SSISDB\Foo\Bar\foobar.dtsx, Environment reference Id: NULL.   
Description: Login failed for user '{domain user that runs SSIS ETL overnight}'.

आपके प्रॉक्सी उपयोगकर्ता के लॉगिन की सबसे अधिक संभावना SSISDB कैटलॉग तक नहीं है (भले ही वह SQL सर्वर तक पहुंच हो सकती है)।
आपको SSISDB उपयोगकर्ता के लिए लॉगिन को मैप करने और एकीकरण सेवाओं में SSISDB फ़ोल्डर / परियोजनाओं तक पहुंच को कॉन्फ़िगर करने की आवश्यकता है।

कृपया इस MSDN ब्लॉग पोस्ट SSIS कैटलॉग एक्सेस कंट्रोल टिप्स और SQL 2012 SSIS कैटलॉग अनुमतियाँ देखें

एक बार जब आपके पास पैकेज होता है तो आप वास्तव में अन्य सुरक्षा संदर्भ मुद्दों में लोड हो सकते हैं, लेकिन आपको एकीकरण सेवाओं से बेहतर लॉगिंग प्राप्त करनी चाहिए।


3
वास्तव में यह। ऊपर और परे जाने के लिए धन्यवाद :-)
मथिउ गुइंडन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.