2013-10-17 72 views
7

我的數據庫有表格,視圖和全部。我需要一種以自動方式爲所有DDL生成SQL腳本的方法。不需要數據。如何使用SMO腳本生成sql腳本

有FK約束,所以表創建腳本應該正確地排序。某些視圖使用另一個視圖,因此視圖創建腳本也必須正確排序。

從呈現在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選項使視圖腳本,包括其相關的表格,這是前面已經包括在內。如果我拿出WithDependencies選項,生成的腳本不會反映正確的順序。

所以最終結果包含所有信息,但它不是可運行的。由於無法兩次創建表,所以會引發錯誤。

我發現有太多關於SMO scripter的帖子,所以我認爲這是我錯過的東西。或者......所有這些帖子都錯過了這個問題?

回答

1

你可以採取不同的方法和腳本出表,然後視圖。通常按照這個順序,事情是有效的,但不是100%。

我會成立WithDependencies假

+0

WithDependencies有兩件事:1)它通過依賴關係重新排序腳本。 2)它自動包含從屬元素。如果我拿出依賴關係,我將不會有#2的任何問題,但我需要手寫來實現#1。這是可行的,只是希望確保對於想要這樣做的人來說期望是正確的。 – kennethc

1

這是無可否認的一個黑客,但可以通過添加錯誤處理運行它之前,你可以修補腳本。你可以利用V3中的新分析器來自動化。

3
  1. 腳本中的所有表沒有外鍵,然後編寫腳本只是外鍵。您可以通過使用腳本選項來完成此操作,並且這樣,由於FK而導致的表之間的依賴關係將無關緊要。
  2. 使用DependencyWalker SMO對象。您可以將視圖的URN添加到它,然後請求一個線性的依賴關係列表。我的回答here對一個類似的問題包含了一個如何使用它的例子。
+0

謝謝你的回答。我將「賞金」授予Renegrin,但你的同樣好。我希望有一種方式來分裂賞金。由於不相關的原因,我的解決方案結束了不同的方法。 – kennethc