2

我正在尝试使用 Smo.Transfer 类在服务器之间复制 sql db。

当你复制绝对正常的数据库时没关系。有用。

但是,如果您的数据不一致怎么办?例如,我有一个函数,它从表和不存在的列中获取值(有人重命名了该列,现在该函数不起作用)。但是如果你尝试生成一个脚本,它会生成好的。

但是当您实际尝试运行此脚本时,问题就开始了。Sql server 不会让你创建函数,因为它不能引用不存在的列。

当您实际运行 .TransferData() 方法时,Transfer 类会发生类似的情况。

问题是。是否可以以某种方式完全跳过对象的创建(在我们的示例中为函数)?

如何捕捉错误,跳过对象并让 .TransferData() 方法继续它的工作?

4

2 回答 2

2

我会首先采取修复损坏的依赖项的方法。然后我会采取一种方法来防止这些依赖关系在未来被破坏。效果将是您的 Transfer 代码将开始工作,并且可能其他代码或与 db 代码的交互也会更好地工作。

要完成所有这些,您需要了解损坏的依赖项。我在这附近的某个地方有东西。如果我找到它,我会回帖。我在想也许是 RedGate 的 Dependency Tracker 2?我记得,就有用而言,它仍然不在我的“区域”内,但它仍然可以为您完成工作。

于 2010-06-23T14:53:30.693 回答
2

不可能阻止该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。

于 2016-02-29T12:35:42.140 回答