我正在尝试使用Smo.Transfer类在服务器之间复制sql db。
当你复制绝对正常的数据库时,它没关系。它有效。
但是,如果您的数据不一致怎么办? 例如,我有一个函数,它从表和不存在的列中获取值(有人重命名了列,现在函数不起作用)。但是如果你尝试生成一个脚本,它将生成好。
但是当你真正尝试运行这个脚本时问题就开始了。 Sql server不允许你创建函数,因为它不能引用不存在的列。
当您实际运行.TransferData()方法时,Transfer类会发生类似的情况。
问题是。是否可以完全跳过某种方式创建对象(在我们的示例中为函数)?
如何捕获错误,跳过对象并让.TransferData()方法继续它的工作?
答案 0 :(得分:2)
我首先采取修复破坏的依赖关系的方法。然后我会采取一种方法来防止这些依赖关系在未来被破坏。结果是您的传输代码将开始工作,并且可能其他代码或与db代码的交互也会更好。
要完成所有这些操作,您需要了解已损坏的依赖项。我身边的某处有东西。如果我找到它,我会回复。我在想RedGate的Dependency Tracker 2?正如我记得的那样,尽管它很有用,它仍然不在我的“区域”中,但它仍然可以为你完成这项工作。
答案 1 :(得分: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。