我的數據庫有表格,視圖和全部。我需要一種以自動方式爲所有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的帖子,所以我認爲這是我錯過的東西。或者......所有這些帖子都錯過了這個問題?
WithDependencies有兩件事:1)它通過依賴關係重新排序腳本。 2)它自動包含從屬元素。如果我拿出依賴關係,我將不會有#2的任何問題,但我需要手寫來實現#1。這是可行的,只是希望確保對於想要這樣做的人來說期望是正確的。 – kennethc