2

Smo.Transferクラスを使用してサーバー間でSQLデータベースをコピーしようとしています。

そして、あなたが絶対に普通のデータベースをコピーしているとき、それは大丈夫です。できます。

しかし、データに一貫性がない場合はどうなりますか?たとえば、関数があり、テーブルと存在しない列から値を取得します(誰かが列の名前を変更したため、関数が機能しなくなりました)。ただし、スクリプトを生成しようとすると、正常に生成されます。

しかし、実際にこのスクリプトを実行しようとすると、問題が始まります。SQL Serverは、存在しない列を参照できないため、関数を作成できません。

実際に.TransferData()メソッドを実行すると、Transferクラスでそのようなことが起こります。

質問はです。どういうわけかオブジェクト(この例では関数)の作成を完全にスキップすることは可能ですか?

エラーをキャッチし、オブジェクトをスキップして、.TransferData()メソッドにその仕事を続行させる方法は?

4

2 に答える 2

2

私は最初に壊れた依存関係を修正するアプローチを取ります。次に、これらの依存関係が将来壊れないように設計されたアプローチを取ります。その結果、転送コードが機能し始め、おそらく他のコードまたはdbコードとの相互作用も同様に機能するようになります。

これらすべてを行うには、壊れた依存関係について知る必要があります。このあたりに何かあります。見つけたら投稿します。おそらくRedGateのDependencyTracker2を考えていますか?私が思い出したように、それはまだ私にとって有用である限り「ゾーン」にはありませんでしたが、それでもあなたのために仕事をするかもしれません。

于 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.ScriptBatchTerminatortrueに設定することを忘れないでください。

于 2016-02-29T12:35:42.140 に答える