SQLServer刪除/重建/禁用/啓用外鍵約束

SQLServer從一個數據庫導數到另一個庫的時候,如果目標庫有外鍵約束,可能會導致導數失敗。這時,可以將外鍵先刪除或禁用,等導數完成後再重建或啓用外鍵。

禁用、啓用外鍵:

[sql] view plain copy

  1. DECLARE @nocheckSql NVARCHAR(max)--禁用外鍵約束的sql
  2. SET @nocheckSql =  
  3. (SELECT 'alter table dbo.['+b.name+'] nocheck constraint ['+a.name+'];' from sysobjects a,sysobjects b where a.xtype='f' and a.parent_obj=b.id and b.xtype='u' for xml PATH('') 
  4. print @nocheckSql 
  5. --execute sp_executesql @nocheckSql
  6. DECLARE @checkSql NVARCHAR(max)--啓用外鍵約束的sql
  7. SET @checkSql =  
  8. (SELECT 'alter table dbo.['+b.name+'] check constraint ['+a.name+'];' from sysobjects a,sysobjects b where a.xtype='f' and a.parent_obj=b.id and b.xtype='u' for xml PATH('') 
  9. print @checkSql 
  10. --execute sp_executesql @checkSql

刪除、重建外鍵:

[sql] view plain copy

  1. declare @createSql nvarchar(max) 
  2. declare @delSql nvarchar(max) 
  3. Set @createSql = ( 
  4. select 'ALTER TABLE ['+OBJECT_NAME(k.parent_object_id)+'] ADD CONSTRAINT ['+k.name+'] FOREIGN KEY (['+COL_NAME(k.parent_object_id,c.parent_column_id)+']) REFERENCES ['+OBJECT_NAME(k.referenced_object_id)+'](['+COL_NAME(k.referenced_object_id,key_index_id)+'])'+case k.delete_referential_action when 0 then '' when 1 then ' ON DELETE CASCADE ' when 2 then ' ON DELETE SET NULL ' when 3 then ' ON DELETE SET DEFAULT ' END+ case k.update_referential_action when 0 then '' when 1 then ' ON UPDATE CASCADE ' when 2 then ' ON UPDATE SET NULL ' when 3 then ' ON UPDATE SET DEFAULT' end +';' from sys.foreign_keys k,sys.foreign_key_columns c where c.constraint_object_id=k.object_id for xml path('') 
  5. print @createSql--重建外鍵約束的語句
  6. set @delSql = ( 
  7. select 'alter table ['+O.name+'] drop constraint ['+F.name+'];' from sysobjects O,sys.foreign_keys F where F.parent_object_id=O.id for xml path('') 
  8. print @delSql --刪除外鍵約束的語句
  9. --exec sp_executesql @delSql
  10. --exec sp_executesql @createSql
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章