自分メモ

  • FK一覧を取得
SELECT FK.name,OBJ.name
FROM sys.foreign_keys AS FK
INNER JOIN sys.objects AS OBJ ON OBJ.object_id = FK.parent_object_id
  • FK全部消す
DECLARE
@sql VARCHAR(500),
@tableName VARCHAR(128),
@fkName VARCHAR(128)
DECLARE triggerCursor CURSOR
FOR
SELECT FK.name
,OBJ.name
FROM sys.foreign_keys AS FK
INNER JOIN sys.objects AS OBJ ON OBJ.object_id = FK.parent_object_id
OPEN triggerCursor
FETCH NEXT FROM triggerCursor
INTO @tableName, @fkName
WHILE ( @@FETCH_STATUS = 0 )
BEGIN
SET @sql = 'ALTER TABLE スキーマ名(INFORMATION_SCHEMA.TABLESから取得するSQL書いても良い).['  @tableName + '] DROP CONSTRAINT [' + @fkName + ']' 
PRINT 'Executing Statement - ' + @sql
EXECUTE ( @sql )
FETCH NEXT FROM triggerCursor
INTO @tableName, @fkName
END
CLOSE triggerCursor
DEALLOCATE triggerCursor
  • 一時的にFKを無効にするにはDROPのところをNOCHECKにすればよく、有効に戻すにはCHECKにする。TRUNCATEにはきかないのでケースによりけりでdeleteするか(トランザクションログが気にならない時)、気になる場合はDROPしてFK作成し直しをする感じ。