【问题标题】:Microsoft.SqlServer.Management.Smo.Transfer classMicrosoft.SqlServer.Management.Smo.Transfer 类
【发布时间】:2010-06-18 15:12:18
【问题描述】:

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

当您复制绝对正常的数据库时没关系。它有效。

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

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

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

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

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

【问题讨论】:

    标签: c# sql sql-server-2008 smo transfer


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-02
        • 2015-08-14
        • 1970-01-01
        • 2015-05-12
        • 2011-12-06
        • 2013-09-11
        相关资源
        最近更新 更多