मेरे पास दो एसएसआईएस पैकेज हैं जो किसी भी मुद्दे के बिना एक बड़े एसएसआईएस तैनाती के हिस्से के रूप में रात भर (एसक्यूएल सर्वर एजेंट के माध्यम से) निर्धारित हैं। सब कुछ विंडोज प्रमाणीकरण का उपयोग कर रहा है, और अनुसूचित नौकरी एक 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
।
SSISProxy
SQL सर्वर एजेंट प्रॉक्सी है जिसे क्रेडेंशियल नाम का उपयोग करते हुए [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]।
ऐसा लगता है कि प्रॉक्सी / क्रेडेंशियल सेट अप करने के तरीके के बारे में कुछ ठीक नहीं है। मैं कौन सा हिस्सा गलत कर रहा हूं?