SQL एजेंट शक्तियाँ संदर्भ संदर्भ


13

मेरी नई नौकरी में, हमारे पास प्रत्येक सर्वर पर कई नामित उदाहरण हैं। जैसे

  • Server1 \ देव
  • Server1 \ DevIntegrated
  • Server1 \ क्यूए

मेरे पास कार्यों में एक SQL PowerShell स्क्रिप्ट है जो OS को कॉल करता है, चालान करता है Foo.exeलेकिन कमांड लाइन पैरामीटर (कनेक्शन स्ट्रिंग) पास करने की आवश्यकता होती है। SQL एजेंट कार्य प्रत्येक उदाहरण पर, PowerShell के एक चरण के साथ मौजूद होगा, जिसे यह जानना होगा कि वर्तमान संदर्भ क्या है। यानी यह क्रियान्वयन DevIntegrated पर शुरू हुआ।

मुझे हर स्क्रिप्ट को शुरू करने की कोई इच्छा नहीं है ...

$thisInstance = "Dev"

... खासकर तब से जब मुझे आने वाले महीनों में वातावरण (नए सर्वर और नामांकित उदाहरण) पर माइग्रेट करना होगा।

यदि मैं SQLPS शुरू करता हूं, तो मैं गेट-लोकेशन या रनिंग के परिणामों को स्लाइस और डीलींग करके अपनी आवृत्ति निर्धारित कर सकता हूं

(Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName

जब SQL एजेंट PowerShell का काम शुरू करता है, तो यह C: \ windows \ system32 में शुरू होता है और Get-Locationयह SQLSERVER संदर्भ में नहीं होने के कारण काम नहीं करता है। मैं उस संदर्भ में बदल सकता हूं, लेकिन मैं SQL सर्वर के "रूट" पर रहूंगा और यह नहीं जान पाऊंगा कि मुझे किस स्थिति में होना चाहिए। Invoke-Sqlcmdमार्ग का उपयोग करना या तो एक ही कारण से काम नहीं करेगा (तकनीकी रूप से, यह समय के रूप में है। कोई डिफ़ॉल्ट उदाहरण नहीं है)

अपने ज्ञान के सर्वश्रेष्ठ के लिए, मैंने सभी बुनियादी "चीजों" की गणना की है जो मैं नौकरी लॉग में प्राप्त कर सकता हूं लेकिन कुछ भी नहीं दिखा रहा है SQLSERVER:\SQL\Server1\DevIntegrated

Get-Processऐसा लगता है कि मैं उस चीज का इस्तेमाल कर सकता हूं और कुछ वूडू उदाहरणों को मारकर और स्पिड से मेल खाते हुए चीजों को एक साथ जोड़ने की कोशिश कर रहा हूं, लेकिन यह नरक से खूनी-हैक की तरह लगता है। कुछ बुनियादी होना चाहिए जो मुझे याद आ रहा है, क्या कोई कुछ प्रकाश डाल सकता है?

पावरशेल के विकल्प की जांच की गई

मैंने अन्य नौकरी प्रकारों का उपयोग करके जांच की थी और संतोषजनक समाधान नहीं मिला। अनुसंधान ने संकेत दिया कि SQL एजेंट के तहत सूचीबद्ध PowerShell SQLPS था और एजेंट पर राइट क्लिक करके इसका एक उदाहरण शुरू करने से मुझे सही स्थान पर गिरा दिया गया। यह केवल तब था जब मैंने अपने संवादात्मक कोड को नौकरी के चरण में चिपकाया, जिसे मैंने पहले उल्लेख किए गए अंतर के बारे में सीखा था।

नौकरी के प्रकार के ओएस ने मुझे एक समान स्थिति में डाल दिया कि मुझे यह निर्धारित करने का कोई तरीका नहीं मिला कि किस उदाहरण ने मुझे कमांड शेल में गिरा दिया। निश्चित रूप से, मैं sqlcmd कर सकता हूं और इसका मूल्य प्राप्त कर सकता हूं, @@servernameलेकिन अगर मुझे पता है कि sqlcmd शुरू करने के लिए क्या कनेक्शन है, तो मुझे डेटाबेस को क्वेरी करने की आवश्यकता नहीं होगी;)

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

थोड़ा असावधान रहते हुए, मैंने पहले चरण में एक चर को परिभाषित करने और उत्तराधिकारी चरणों को पारित करने के बारे में सोचा लेकिन अनुसंधान ने इस लेख को एकाधिक नौकरी चरणों (बीओएल) को संभालते हुए बदल दिया।

जॉब स्टेप को स्व-निहित होना चाहिए। यही है, एक नौकरी बुलियन मूल्यों, डेटा, या नौकरी चरणों के बीच संख्यात्मक मूल्यों को पारित नहीं कर सकती है। हालाँकि, आप स्थायी तालिका या वैश्विक अस्थायी तालिकाओं का उपयोग करके मानों को एक Transact-SQL नौकरी चरण से दूसरे में पास कर सकते हैं। आप नौकरी के चरणों से मानों को पारित कर सकते हैं जो निष्पादन योग्य कार्यक्रमों को एक नौकरी के चरण से दूसरे नौकरी के चरणों तक फ़ाइलों का उपयोग करके चलाते हैं।

मैं एक अच्छी तरह से ज्ञात फ़ाइल / पर्यावरण चर / रजिस्ट्री सेटिंग की तरह सामान्य ट्रिक का उपयोग नहीं कर सकता, जो Foo.exeकि उस समय के लिए समवर्ती निष्पादन को रोकता है।

टी एल; डॉ:

PowerShell के SQL एजेंट जॉब चरण में, आप प्रक्रिया शुरू करने वाले SQL सर्वर का उदाहरण कैसे निर्धारित कर सकते हैं?


4
क्या शक्तियां आपके लिए क्या कर रही हैं?
जॉन्डाकोस्टा

वास्तविक आवश्यकता SQL एजेंट में "कुछ" को पुन: उपयोग करने के लिए होगी, जो इन्वेसटिव आवृत्ति के पैरामीटर के साथ डॉस प्रक्रिया को लॉन्च कर सकता है। PowerShell ने सबसे अच्छा फिट महसूस किया जो ऊपर काम नहीं करता था। मार्मिक प्रतिक्रिया के लिए क्षमा करें, मैं स्काउट शिविर में बाहर था।
12

जवाबों:


9

यदि आप SQL सर्वर BOL में देखते हैं, तो SQL सर्वर एजेंट "टोकन" का एक सेट प्रदान करता है, जो कि यह जॉब स्टेप कमांड टेक्स्ट और आउटपुट फाइल दोनों में बदलेगा (बाद में GUI "व्यू" बटन को काम करने से रोकेगा)। ये टोकन टी-एसक्यूएल को छोड़कर किसी भी प्रकार के कदम के लिए काम करते हैं।

https://docs.microsoft.com/en-us/sql/ssms/agent/use-tokens-in-job-steps#sql-server-agent-tokens

इसलिए, यदि आपके पास SQL ​​2008 PowerShell चरण है, तो आप इसे इसके साथ शुरू कर सकते हैं:

$sqlInstance = "$(ESCAPE_DQUOTE(SRVR))"

आपको इसके बजाय MACH(मशीन नाम) और INST(केवल उदाहरण नाम) का उपयोग करने की आवश्यकता हो सकती है , क्योंकि डिफ़ॉल्ट उदाहरण के SRVR == MACHसाथ, लेकिन नामित उदाहरणों के साथ SRVR == MACH\INST


3

दुख की बात है कि मैंने SQL सर्वर के अंदर पॉवरशेल स्क्रिप्ट के साथ बहुत कुछ नहीं किया है। और न ही मैं उस कंप्यूटर पर हूं, जिसे मैं अभी इसके साथ खेल सकता हूं।

मेरा मानना ​​है कि हालांकि PowerShell प्रकार के चरण का उपयोग करने के बजाय कि यदि आप CmdExec का उपयोग करते हैं और अपनी स्क्रिप्ट को कॉल करते हैं, तो आप कमांड लाइन "पावरशेल 'MyScript.ps1'" से कॉल कर सकते हैं, तो आप एक पैरामीटर को पास कर सकते हैं जिसमें आपके द्वारा चलाए जा रहे उदाहरण हैं। जैसे "Powershell 'MyScript.ps1' MyInstanceName"।

तो आपकी स्क्रिप्ट की शुरुआत के लिए MyInstanceName का मान स्वीकार करने के लिए आपके पास एक परम () सेटअप है:


param(
   [Parameter(Position=0,Mandatory=$True)]
   [string]$InstanceName
)
#so if I wanted to use sqlcmd
sqlcmd -S $InstanceName -Q "SELECT @@VERSION"

जैसा कि आपने यह जानने के लिए आवश्यक एक कदम बताते हुए शुरू किया कि यह किस तरह का था इसलिए PowerShell स्क्रिप्ट Foo.exe को ठीक से कॉल कर सकती है। हालांकि, बाद में आप अन्य चरणों के लिए मूल्य पारित करने में सक्षम होने का उल्लेख करते हैं। यदि यह सच है तो आप एक छोटा एसएसआईएस पैकेज बनाना चाह सकते हैं जो आपकी पॉवरशेल स्क्रिप्ट को कॉल करे और आपको जो कुछ भी चाहिए वह करे। SSIS के साथ आप एक वैश्विक वैरिएबल सेटअप करने में सक्षम हो सकते हैं जिसका पूरा पैकेज उपयोग कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.