專案交付前需清除測試資料、保留結構;或定期重置測試環境。表數量大時手工 TRUNCATE/DELETE 易遺漏、外鍵阻礙。本腳本三階段自動化:1. 將所有外鍵改為 CASCADE DELETE → 2. 逐表 DELETE 並 RESEED 身分識別欄 → 3. 還原外鍵原始刪除規則,全程含交易保護與錯誤記錄。
@AllRelationships (含原始 DeleteRule)。DROP CONSTRAINT ... ADD CONSTRAINT ... ON DELETE CASCADE,交易包裹,失敗回滾並記錄。DELETE FROM table; DBCC CHECKIDENT (table, RESEED, 0) 重設種子為 0。@AllRelationships 記錄的原始 DeleteRule (NO_ACTION/CASCADE/SET_NULL/SET_DEFAULT) 還原外鍵定義。DECLARE @AllRelationships TABLE (
ForeignKey VARCHAR(512),
TableName VARCHAR(512),
ColumnName VARCHAR(512),
ReferenceTableName VARCHAR(512),
ReferenceColumnName VARCHAR(512),
DeleteRule VARCHAR(512)
);
INSERT INTO @AllRelationships
SELECT f.name,
OBJECT_NAME(f.parent_object_id),
COL_NAME(fc.parent_object_id, fc.parent_column_id),
OBJECT_NAME(f.referenced_object_id),
COL_NAME(fc.referenced_object_id, fc.referenced_column_id),
delete_referential_action_desc
FROM sys.foreign_keys f
JOIN sys.foreign_key_columns fc ON f.object_id = fc.constraint_object_id;
DECLARE DataBaseTables0 CURSOR FOR
SELECT SCHEMA_NAME(t.schema_id), t.name FROM sys.tables t;
OPEN DataBaseTables0;
FETCH NEXT FROM DataBaseTables0 INTO @TableOwner, @TableName;
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS (SELECT 1 FROM @IgnoreTables WHERE TableName = @TableName)
BEGIN
DECLARE DataBaseTableRelationships CURSOR FOR
SELECT ForeignKey, ColumnName, ReferenceTableName, ReferenceColumnName
FROM @AllRelationships WHERE TableName = @TableName;
-- ... 迴圈內動態 SQL ALTER TABLE ... ON DELETE CASCADE ...
END
FETCH NEXT FROM DataBaseTables0 INTO @TableOwner, @TableName;
END
DECLARE @IgnoreTables TABLE (TableName VARCHAR(512));
INSERT INTO @IgnoreTables VALUES ('sysdiagrams'); -- 可自行擴充
@IgnoreTables 是否需新增保護表。此腳本將「清空所有資料並重設種子」從繁瑣手工操作轉為可重複、可審計、可擴充的自動化流程,極大降低交付前準備與測試環境重置的時間成本與風險。