1

データを含む300個のテーブルで構成されるデータベースがあります。各テーブル内のすべてのデータを削除する必要があります。すべてのテーブルを切り捨てようとしましたが、テーブルの列の1つが外部キーであるため、プロセスを完了できないというエラーが発生しました。私の問題を解決する他の方法はありますか?ありがとう。

4

2 に答える 2

4

次のいずれかを行う必要があります。

  • すべての外部キーを削除し、切り捨ててから、FKを再作成します。
  • すべての外部キーを無効にし、(切り捨てではなく)削除してから、FKを再度有効にします。また、
  • 最初に子テーブルから削除します。

幸運にも循環参照があれば後者は不可能かもしれませんし、循環参照がなくても複雑になる可能性があります。最初の2つも比較的複雑ですが、最近、別のユーザーの非常によく似た問題を解決しました(適切な削除順序を決定するよりも、これらの方が簡単だと思います)。

すべての外部キー制約を一時的に無効にします

もう1つのアイデアは、より単純でより完全なワイプを実行することです。

  • テーブル(および明らかに他のオブジェクト)をスクリプト化し、データベースを削除して再作成します。また、
  • データベースのコピーを作成し、Visual Studio / SSDTまたはサードパーティのスキーマ比較ツールを使用して、空のデータベースにすべてのオブジェクトを作成します(その後、古いデータベースを削除して新しいデータベースの名前を変更できます)。
于 2012-08-07T02:45:52.680 に答える
-1

これを試してください:それを行う簡単な方法。sp_msforeachtableは文書化されていないSPであるため、それらを使用することにはリスクがあります。私は、アーロンロジックを使用して、彼の回答で使用されている制約を無効にすることで、この回答を思いつきました。

use [YourDB]
Go

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'Truncate Table ?'
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
于 2012-08-07T03:05:12.613 に答える