0

従来のデータベースに約80個の「欠落している」外部キーを追加しましたが、(当然のことながら)FKの制約により、テーブルを削除するときにデータベースの再作成スクリプトが失敗するようになりました。戦略は常に自然な順序でテーブルをドロップすることであり、これは今までうまくいきました。私はこのアプローチを維持したくなく、次のようにすべてのFK制約を無効にしようとしました。

USE MYDB;
GO

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
GO

DROP TABLE [dbo].[Table1]
DROP TABLE [dbo].[Table2]
DROP TABLE [dbo].[Table3]
...

exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
GO

問題は、まだエラーが発生していることです。

メッセージ3726、レベル16、状態1、行17オブジェクト'dbo.Table1'は、FOREIGN KEY制約によって参照されているため、削除できませんでした。メッセージ3726、レベル16、状態1、行18オブジェクト'dbo.Table2'は、FOREIGN KEY制約によって参照されているため、削除できませんでした。

誰かが私が間違っていることを提案できますか?Windows7でSQLServer2008r2を使用しています。

編集:循環参照があることに気づきました。つまり、Table1にはTable2へのFKがあり、その逆もありますが、それでも...。

4

1 に答える 1

1

drop tableコマンドを実行する前に、すべての制約を削除できます。スクリプトの上部にあるこのようなものが機能するはずです。

   declare @newLine as varchar(1) = char(13);
   declare @sqlCmd as varchar(max) = '';

   SELECT @sqlCmd = @sqlCmd + 'alter table ' + OBJECT_NAME(parent_object_id) + ' drop constraint ' + OBJECT_NAME(OBJECT_ID) + ';' + @newLine
   FROM sys.objects
   WHERE type_desc LIKE '%CONSTRAINT'
         and OBJECT_NAME(parent_object_id) not in ('list','of','tables','to','ignore')
  order by case when left(OBJECT_NAME(OBJECT_ID),2) = 'PK' then 1 else 0 end
  exec (@sqlCmd)
  go
于 2012-11-20T20:30:24.833 に答える