2013-10-17 4 views
7

का उपयोग कर एसक्यूएल स्क्रिप्ट उत्पन्न करने के लिए कैसे करें मेरे डेटाबेस में टेबल, विचार और सभी हैं। और मुझे स्वचालित रूप से सभी डीडीएल के लिए एसक्यूएल स्क्रिप्ट उत्पन्न करने का एक तरीका चाहिए। डेटा की कोई ज़रूरत नहीं है।एसएमओ स्क्रिप्टर

एफके बाधाएं हैं इसलिए टेबल निर्माण स्क्रिप्ट को ठीक से आदेश दिया जाना चाहिए। कुछ विचार एक और दृश्य का उपयोग करते हैं, इसलिए निर्माण स्क्रिप्ट को भी ठीक से आदेश दिया जाना चाहिए।

MSDN Blog पर प्रस्तुत एक स्क्रिप्ट से शुरू, मैं निम्नलिखित है:

function Generate-SqlScript 
{ 
    param(
    [string]$srvname, 
    [string]$database, 
    [string]$ScriptOutputFileName 
    ) 

    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null 

    $srv = New-Object ("Microsoft.SqlServer.Management.SMO.Server") ($srvname) 

    $allUrns = @() 
    $allUrns += $srv.Databases[$database].Tables | foreach { $_.Urn} 
    $allUrns += $srv.Databases[$database].Views | foreach { $_.Urn} 

    $scriptingOptions = New-Object ("Microsoft.SqlServer.Management.SMO.ScriptingOptions") 
    $scriptingOptions.WithDependencies = $true 
    $scriptingOptions.AllowSystemObjects = $false 
    $scriptingOptions.ToFileOnly = $true 
    $scriptingOptions.Permissions = $true 
    $scriptingOptions.FileName = "$ScriptOutputFileName" 

    $scripter = New-Object ("Microsoft.SqlServer.Management.SMO.Scripter") ($srv) 
    $scripter.Options = $scriptingOptions; 

    $scripter.Script($allUrns) 
} 

Generate-SqlScript .\sqlexpress <MyDbName> <FilePath> 

अब समस्या है, WithDependencies विकल्प इसकी निर्भर टेबल, जो पहले से ही पहले शामिल किया गया था शामिल करने के लिए दृश्य स्क्रिप्ट का कारण बनता है। अगर मैं निर्भरता विकल्प निकालता हूं, जेनरेट की गई स्क्रिप्ट उचित ऑर्डरिंग को प्रतिबिंबित नहीं करती है।

तो अंतिम परिणाम में सभी जानकारी शामिल है, लेकिन यह चलाने योग्य नहीं है। यह एक त्रुटि उठाता है क्योंकि यह तालिका को दो बार नहीं बना सकता है।

मुझे इसके लिए एसएमओ स्क्रिप्टर के बारे में बात करने में बहुत सारी पोस्ट मिलती हैं, इसलिए मुझे लगता है कि मुझे कुछ याद आना चाहिए। या ... क्या उन सभी पदों ने इस समस्या को याद किया?

उत्तर

6

ऑब्जेक्ट्स को स्क्रिप्ट करने से पहले आपको अपनी PowerShell स्क्रिप्ट में निर्भरता क्रम में तालिकाओं को खोजने और क्रमबद्ध करने की आवश्यकता है। निम्नलिखित ब्लॉग पर इसके कार्यान्वयन की समीक्षा करें: http://patlau.blogspot.com/2012/09/generate-sqlserver-scripts-with.html

अवधारणा सी # में मुझे स्पष्ट थी। विदेशी कुंजी के बिना स्क्रिप्ट बाहर सिर्फ विदेशी कुंजी http://sqlblog.com/blogs/ben_miller/archive/2007/10/18/scripting-tables-views-and-data-using-smo-part-3.aspx

1

आप टेबल और फिर विचारों को एक अलग दृष्टिकोण और स्क्रिप्ट ले सकते हैं। आम तौर पर उस क्रम में, चीजें काम करती हैं, लेकिन 100% नहीं।

मैं झूठी

+0

निर्भरता दो चीजें करता है: 1) यह निर्भरता द्वारा लिपियों को फिर से ऑर्डर करता है। 2) इसमें आश्रित तत्व स्वचालित रूप से शामिल हैं। अगर मैं निर्भरता से बाहर निकलता हूं, तो मुझे # 2 से कोई समस्या नहीं होगी लेकिन मुझे # 1 प्राप्त करने के लिए हाथ-लिखने की आवश्यकता है। यह करने योग्य है, बस यह सुनिश्चित करना चाहते हैं कि जो भी ऐसा करना चाहता है, उसके लिए उम्मीद सही हो। – kennethc

1

को WithDependencies स्थापित करेगा यह बेशक एक हैक है, लेकिन इससे पहले कि आप यह त्रुटि हैंडलिंग जोड़कर चलाने आप स्क्रिप्ट पैच सकता है। आप इसे स्वचालित करने के लिए V3 में नए पार्सर का लाभ उठा सकते हैं।

3
  1. स्क्रिप्ट सभी तालिकाओं, तो: जाँच करें। आप इसे स्क्रिप्टिंग विकल्पों का उपयोग करके कर सकते हैं, और इस तरह एफके के कारण तालिकाओं के बीच निर्भरता कोई फर्क नहीं पड़ता।
  2. DependencyWalker एसएमओ ऑब्जेक्ट का उपयोग करें। आप इसे देखने के लिए यूआरएन जोड़ सकते हैं और फिर निर्भरताओं की रैखिक सूची मांग सकते हैं। मेरे उत्तर here इसी तरह के प्रश्न में इसका उपयोग करने के लिए एक उदाहरण है।
+0

आपके उत्तर के लिए धन्यवाद। मैंने रेनेग्रिन को बक्षीस से "सम्मानित किया" लेकिन आपका उतना ही अच्छा है। मेरी इच्छा है कि बक्षीस को विभाजित करने का कोई तरीका था। मेरा समाधान असंबंधित कारण के लिए अलग दृष्टिकोण होने के समाप्त हो गया। – kennethc

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