[轉] SQL Server 批量 停用/啟用 外鍵約束


本文轉自:http://hi.baidu.com/wangzhiqing999/item/ca699308de4f1ff9a1103429

今天百度知道上面,看到這樣一個要求:

現在有一個庫,有很多張表
想要刪除一張表的記錄的時候,由於外鍵關聯太多,
所以,沒法刪除相應的記錄,
誰能幫忙寫個存儲過程,就是先刪除所有表的主,外鍵,
然后進行刪除表記錄,然后再恢復之前所有的主外鍵.


一眼看上去,需要批量刪除所有外鍵,並不困難。
但是要求批量所有外鍵之后,
一切處理完畢后,還要把外鍵重建回來。
這個有點復雜了。

心想,如果刪除之后,還要重建的。
那還不如一開始就不刪除,只是暫時 “不可用”。
等一系列的操作執行完畢后,
再把這些前面暫時 “不可用” 的外鍵  “恢復使用”

 

首先生成 停用 外鍵的SQL語句

 

select 

  'ALTER TABLE '+o.name+' NOCHECK CONSTRAINT '+fk.name+';'  AS  Command

from 

  sys.foreign_keys  fk  

  JOIN  sys.all_objects  o  ON (fk.parent_object_id=o.object_id)

 

具體會有多少條記錄,取決於你的數據庫里面,有多少個外鍵了。
在我的測試數據庫里面,只有一個外鍵。
所以我的執行結果為:

ALTER TABLE test_sub NOCHECK CONSTRAINT main_id_cons;

 

把所有的執行結果,都去執行一遍, 就可以將所有的 外鍵約束停用。

 

下面是執行的測試:

 

1> delete  from test_main
2> go
消息 547,級別 16,狀態 1,服務器 GMJ-PC\SQLEXPRESS,第 1DELETE 語句與 REFERENCE 約束"main_id_cons"沖突。該沖突發生於數據庫"Test",表"dbo
.test_sub", column 'main_id'。
語句已終止。
1>ALTER TABLE test_sub NOCHECK CONSTRAINT main_id_cons;
2> go
1> delete from test_main
2> go

(2 行受影響)
1> delete from test_sub
2> go

(2 行受影響)

 

數據清理完畢后,恢復外鍵

select 

  'ALTER TABLE '+o.name+' CHECK CONSTRAINT '+fk.name+';'  AS  Command

from 

  sys.foreign_keys  fk  

  JOIN  sys.all_objects  o  ON (fk.parent_object_id=o.object_id)

 

我的執行結果為:

ALTER TABLE test_sub CHECK CONSTRAINT main_id_cons;

 

測試外鍵約束是否啟用了

 

1> ALTER TABLE test_sub CHECK CONSTRAINT main_id_cons;
2> go
1> INSERT INTO test_sub VALUES (1, 2 , 'A');
2> go
消息 547,級別 16,狀態 1,服務器 GMJ-PC\SQLEXPRESS,第 1INSERT 語句與 FOREIGN KEY 約束"main_id_cons"沖突。該沖突發生於數據庫"Test",表"d
bo.test_main", column 'id'。
語句已終止。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM