質問
「SQL Serverオブジェクトをコピー」でエラーを発生させているDTSパッケージがあります。仕事。タスクは、1つのSQL Server 2000 SP4サーバーから別の(同じバージョンの)サーバーにテーブルとデータをコピーしており、エラーが発生しています:-
'dbo.MyTableName'のCHECK制約が見つかりませんでしたが、テーブルに制約があることが示されています。
ソーステーブルには、問題の原因と思われる1つのチェック制約が定義されています。 DTSパッケージを実行した後、物は適切に動作するように見えます-テーブル、すべての制約、およびデータは宛先サーバーで作成されますか?ただし、上記のエラーが発生すると、後続のステップは実行されません。
このエラーが発生する理由は何ですか?
解決
これは、sysテーブルのメタデータが実際のスキーマと同期しなくなったことを示します。より一般的な破損の兆候が他にない場合は、テーブルを別のテーブルにコピーして(*をoldtableからnewtableに選択して)テーブルを再構築し、古いテーブルを削除してから新しいテーブルの名前を変更して制約を置き換えます助けて。これは、テーブルの最後にない列を挿入するときに2000のEnterprise Managerが処理する方法に似ているため、テーブルの中央に新しい列を挿入してから削除すると、同じことが実現しますクエリを手動で記述したくない。
この種のエラーが他にも発生した場合、データベース全体の状態に多少懸念があります。 (ここでは、すでにCHECKDBコマンドを実行しており、エラーが持続していると仮定しています...)
他のヒント
このエラーは、新しい列(チェック制約付き)が既存のテーブルに追加されたときに開始されました。調査するには:-
- テーブルを別の宛先SQL Serverにコピーし、同じエラーが発生しました。
- まったく同じ構造で名前が異なる新しいテーブルを作成し、エラーなしでコピーしました。
- 問題のテーブルのチェック制約を削除して再作成しましたが、同じエラーが発生します。
- ALL_ERRORMSGSを指定したdbcc checktable( 'MyTableName')はエラーを返しません。
- ソースおよび宛先データベースのdbcc checkdbでエラーは発生しません。
興味深いことに、DTSパッケージは次のように見えます:-
- 表をコピーします。
- データをコピーします。
- 制約を作成する
チェック制約の作成時間はテーブルの作成時間の7分後です。つまり、データを移動した後にチェック制約を作成します。コピー中にデータをチェックする必要がなく、おそらくパフォーマンスが向上するため、理にかなっています。
Godekeが示唆しているように、同じ列を持つ新しいテーブルが機能するため、システムテーブルで何かが壊れていると思います。 DBCCステートメントにエラーはありませんが