在 SSMS 設計師中修改資料表結構 (如變更欄位允許 NULL、調整資料類型、插入欄位順序) 時,若涉及資料表重建,預設會彈出警告並阻止儲存。本文詳細說明該選項運作機制、觸發重建的操作清單、風險評估、何時可安全關閉與最佳實務建議。
「不允許儲存變更。您所做的變更需要刪除並重新建立下列資料表。您只能對資料表進行不需要重新建立的變更,或啟用選項以防止儲存需要重新建立資料表的變更。」
| 操作類別 | 具體動作 |
|---|---|
| 欄位資料類型變更 | INT → BIGINT、VARCHAR(50) → VARCHAR(100)、DECIMAL 精度/小數位調整 |
| 欄位順序調整 | 在非最後一欄位前插入新欄位、拖曳調整順序 |
| 計算欄變更 | 修改計算運算式、變更 PERSISTED 屬性 |
| 身分識別欄位 | 新增/移除 IDENTITY、變更 SEED/INCREMENT |
| NULL 屬性 | NOT NULL ↔ NULL (含預設值處理) |
| 欄位重新排序 | 任何非附加至末尾的順序變更 |
SELECT * 參考該表,重建後可能需重新編譯或失效。| 場景 | 風險控制措施 |
|---|---|
| 開發/測試環境 | 資料可重建、無變更追蹤、可接受短暫停機 |
| 需在中間插入欄位 (T-SQL 無法直接支援) | 評估資料量 < 10 萬列、備份完成、維護窗口執行 | 確認無變更追蹤、無複寫、無 CDC 相依 | 執行前完整備份、驗證備份可還原 |
| 確定硬體資源充足 (記錄檔磁碟、TempDB、記憶體) | 預估重建時間 < 維護窗口 50% |
ALTER TABLE 逐步遷移 (如新增欄位 → 更新資料 → 刪除舊欄 → 重命名)。RESTORE VERIFYONLY 通過。-- 目標:在 Col2 後插入 NewCol
BEGIN TRAN;
ALTER TABLE T ADD NewCol INT NULL; -- 先加在最後
UPDATE T SET NewCol = Col2 * 10; -- 回填資料
-- 若需調整順序,需建立新表複製資料 (SSDT 自動處理)
COMMIT;
SSDT 部署時會自動產生建立新表 → 複製資料 → 切換 的安全腳本。