2009-12-29 79 views
0

我需要使用T-SQL在SQL Server 2005中刪除一個特定的數據庫。我知道刪除數據庫不能在數據庫trnsaction中完成。那麼,如果刪除一個真正巨大的數據庫時會發生一些意外的異常。超時例外。它會使我的數據庫處於不穩定狀態嗎?如果是的話,我該如何避免這種情況?什麼是以編程方式刪除大型數據庫的最佳方法

回答

2

取決於您如何運行t-sql,您可以在運行命令之前更改超時。 SSMS默認沒有超時,但可以將SqlCommand的CommandTimeout更改爲0(無超時)或較大的值。根據我個人的經驗,「drop database」失敗的運行並沒有阻止它成功的後續運行,所以雖然你可能會讓數據庫進入一個糟糕的狀態,但我不認爲它會在那裏仍然存在,但不可丟棄(但這只是我的經驗,誠然)

根據是否要刪除數據文件,我建議將數據庫設置爲single_user模式(如果要刪除文件)或脫機(不要刪除文件)並立即回滾,以防止其他連接阻止丟棄或導致失敗。

所以:

  • ALTER DATABASE [富]集SINGLE_USER與回滾立即
  • ALTER DATABASE [富]與回滾立即
  • DROP DATABASE [富]設置爲脫機

請務必檢查drop database的各種行爲(如上所示)@http://msdn.microsoft.com/en-us/library/ms178613.aspx

3

刪除所有記錄在數據庫中,同時使數據庫結構到位,最好的辦法是:

  1. 使數據庫脫機;
  2. 禁用所有外鍵約束(如果強制執行參照完整性);
  3. 依次截斷每個表;
  4. 啓用所有外鍵約束(如果需要引用完整性);
  5. 刷新任何物化視圖;
  6. 重新分析數據庫(因爲之前的統計數據不再相關);
  7. 使數據庫重新聯機。

這一切都可以通過編程方式完成,但會根據您的數據庫供應商和版本而有所不同。對於SQL Server 2005(您的請求版本),請嘗試How to: Truncate Multiple Tables In SQL Server and the magic of sp_MSforeachtable

這不應該讓數據庫處於無法使用的狀態,如果它失敗了,因爲它是以這樣的方式完成的,如果它意外停止,您可以重新運行它,它會繼續。

如果您嘗試使用數據庫,如果腳本過早完成,那麼您的數據庫完全有可能處於不一致的狀態(這是您脫機執行它的一半原因;另一個原因是爲了避免鎖定) 。

更新:如果您只是想完全刪除數據庫,請參閱How do I drop a SQL Server database?。它涉及到一個DROP DATABASE命令,但有時您需要有效地使數據庫脫機。

+0

如果在使用TRUNCATE TABLE時存在引用鍵,則只需禁用(或刪除)約束,在這種情況下,如果表是關係中的父表,則重新啓用/添加約束的嘗試將失敗。 – 2009-12-29 09:09:48

+0

@OMG:澄清了約束部分。 – cletus 2009-12-29 09:11:45

+0

我甚至不想在服務器上留下數據庫結構,需要完全刪除數據庫。 – 2009-12-29 09:34:58

0

分離數據庫,然後刪除文件。

+1

重新連接之前,您無法訪問分離的SQL Server數據庫。 – 2009-12-29 09:11:42

+0

正確,這不會有幫助,因爲它需要以編程方式完成。您無法訪問分離的SQL Server數據庫。可能會給你一個運輸級別的錯誤。 – 2009-12-29 09:33:28

相關問題