0

「SQLServerオブジェクトのコピー」タスクでエラーが発生するDTSパッケージがあります。このタスクは、テーブルとデータを1つのSQL Server 2000 SP4サーバーから別のサーバー(同じバージョン)にコピーすることであり、次のエラーが発生します。

'dbo.MyTableName'のCHECK制約が見つかりませんでしたが、テーブルに1つあるというフラグが立てられています。

ソーステーブルには、問題の原因と思われるチェック制約が1つ定義されています。DTSパッケージを実行した後、物事は正しく機能しているように見えます-テーブル、すべての制約、およびデータは宛先サーバーで作成されていますか?ただし、上記のエラーが発生すると、後続のステップが実行されなくなります。

このエラーが発生する理由はありますか?

4

2 に答える 2

2

これは、sys テーブルのメタデータが実際のスキーマと同期していないことを示しています。より一般化された破損の他の兆候が見られない場合は、テーブルを別のテーブルにコピーして再構築し (select * into newtable from oldtable)、古いテーブルを削除してから新しいテーブルの名前を変更し、制約を置き換えます。ヘルプ。これは、2000 の Enterprise Manager がテーブルの最後にない列を挿入したときの動作に似ているため、新しい列をテーブルの中央に挿入してから削除すると、同じ結果が得られます。手動でクエリを書きたくない。

この種のエラーが他にも発生した場合は、データベース全体の状態が少し気になります。(ここでは、すでにCHECKDBコマンドを実行しており、エラーが持続していると想定しています...)

于 2008-10-18T01:16:21.693 に答える
0

このエラーは、新しい列 (チェック制約付き) が既存のテーブルに追加されたときに発生しました。調査するために、私は持っています: -

  • テーブルを別の宛先 SQL Server にコピーし、同じエラーが発生しました。
  • まったく同じ構造で名前が異なる新しいテーブルを作成し、エラーなしでコピーしました。
  • 問題のあるテーブルのチェック制約を削除して再作成しましたが、それでも同じエラーが発生します。
  • ALL_ERRORMSGS を指定した dbcc checktable ('MyTableName') でエラーが発生しません。
  • ソース データベースと宛先データベースで dbcc checkdb を実行しても、エラーは発生しません。

興味深いことに、DTS パッケージは次のように表示されます。

  • テーブルをコピーします。
  • データをコピーします。
  • 制約を作成する

チェック制約の作成時間はテーブル作成時間の 7 分後であるため、つまり、データの移動後にチェック制約が作成されます。コピー中にデータをチェックする必要がなく、おそらくパフォーマンスが向上するため、理にかなっています。

Godeke が示唆するように、同じ列を持つ新しいテーブルが機能するため、システム テーブルで何かが破損していると思います。DBCC ステートメントでエラーが発生しない場合でも?

于 2008-10-20T10:55:42.307 に答える