在專案交付給客戶前,往往需要將測試環境的資料庫清空,以提供一個乾淨的初始狀態。若資料表數量龐大,逐一手動 TRUNCATE 或 DELETE 不僅耗時,極易因外鍵約束導致錯誤或遺漏。本文提供一套成熟的 T-SQL 腳本,能自動處理所有使用者資料表的外鍵關聯、級聯刪除規則暫時調整、資料清除與種子重置,最後還原原始約束,實現一鍵式安全清空。
腳本首先掃描 sys.foreign_keys 與 sys.foreign_key_columns,建立完整的關聯關係表變數 @AllRelationships。接著以游標遍歷每張表(排除 sysdiagrams 等系統表),對該表擁有的每個外鍵執行 DROP CONSTRAINT 再 ADD CONSTRAINT ... ON DELETE CASCADE,並以交易包裹確保原子性。若某外鍵無法改為 CASCADE(如參考欄位不允許 NULL),會記錄錯誤並回滾該筆變更,不中斷整體流程。
再次以游標遍歷所有使用者資料表,對每張表執行 DELETE FROM [schema].[table];緊接著呼叫 DBCC CHECKIDENT (['table'], RESEED, 0) 將身分識別欄歸零。同樣採用 TRY...CATCH 捕獲錯誤(如仍有外鍵阻擋),輸出錯誤碼與訊息供事後排查。
根據先前記錄的 DeleteRule(NO_ACTION、CASCADE、SET_NULL、SET_DEFAULT),再次以游標逐表、逐外鍵執行 DROP/ADD CONSTRAINT 還原,確保資料庫結構與業務邏輯完全一致。
@IgnoreTables 表變數預設排除 sysdiagrams,可自行擴充需保留資料的表名。PRINT 訊息,便於在 SSMS「訊息」頁籤即時監控執行狀態。此腳本已於多個專案交付場景驗證,能大幅降低人工操作風險,歡迎依實際需求調整忽略清單與錯誤處理邏輯。