2010-06-18 50 views
2

我想在使用Smo.Transfer類的服務器之間複製sql數據庫。Microsoft.SqlServer.Management.Smo.Transfer類

當你複製絕對正常的數據庫時就可以了。有用。

但是如果你的數據不一致呢? 例如我有一個函數,它從一個表和不存在的列中獲取值(有人重命名了列,現在該函數不起作用)。但是如果你嘗試生成一個腳本,它會生成好的。

但是,當您真正嘗試運行此腳本時,問題就開始了。 Sql服務器不會讓你創建函數,因爲它不能引用一個不存在的列。

當您實際運行.TransferData()方法時,類似於Transfer類發生的情況。

問題是。是否有可能完全跳過創建對象(在我們的例子中是函數)?

如何捕獲錯誤,跳過對象並讓.TransferData()方法繼續它的工作?

回答

2

我首先會採取修復破壞的依賴關係的方法。然後,我會採取一種旨在防止未來依賴關係被破壞的方法。效果是你的Transfer代碼會開始工作,並且可能其他代碼或與db代碼的交互也會更好。

要做到這一切,你需要知道關於錯誤的依賴關係。我在這附近有某個地方。如果我找到了,我會回覆。我在想也許RedGate的Dependency Tracker 2?正如我回憶的那樣,儘管對我有用,它仍然不在我的「區域」中,但它仍然可能爲你做好這項工作。

0

不可能阻止TransferData方法停止第一個錯誤。但是,有一種解決方法。您可以代替生成SQL腳本,並立即執行 - 在這種情況下,你可以迫使它繼續錯誤:

$Transfer.Options.ScriptBatchTerminator = $true 
$ScriptFileName = $PSScriptRoot + '\\' + $DbName + '.sql' 
$Transfer.Options.FileName = $ScriptFileName 
$Transfer.Options.ToFileOnly = $true 
$Transfer.EnumScriptTransfer() 

Invoke-SqlCmd -InputFile $ScriptFileName -ServerInstance $SQLInstanceName -Database $TargetDbName -ErrorAction Continue 

只記得設置Options.ScriptBatchTerminator爲true。