首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

解決 SQL Server 2008 R2 修改表結構「不允許儲存變更」錯誤

     編輯:關於SqlServer

錯誤現象

在 SSMS 表設計師中修改結構 (如新增外來鍵、變更資料類型、重排欄位) 時,點選儲存出現:

不允許儲存變更。您所做的變更需要卸除並重新建立下列資料表...

根本原因

SSMS 預設啟用 「防止儲存需要重建資料表的變更」 選項。當變更涉及:

  • 變更資料類型 (可能截斷資料)
  • 新增/移除欄位 (非末尾)
  • 變更 NULL/NOT NULL
  • 重排欄位順序
  • 新增需要驗證既有資料的約束

SSMS 會嘗試建立新表 → 複製資料 → 刪除舊表 → 重命名,為防誤操作預設封鎖。

解決方法 (SSMS 設定)

  1. 選單列:工具 → 選項
  2. 左側樹狀:設計工具 → 資料表與資料庫設計工具
  3. 3. 取消勾選:防止儲存需要重建資料表的變更
  4. 點選 確定
  5. 重新嘗試儲存表結構

⚠ 風險警示

風險說明
資料截斷縮減欄位長度 (如 VARCHAR(100)→VARCHAR(50)) 會無訊息截斷
資料遺失轉換失敗 (如 VARCHAR→INT 含非數字) 導致整批失敗
長時間鎖表大表重建需 Sch-M 鎖,封鎖所有存取
身分識別/時間戳重設重建表會重置 IDENTITY、ROWVERSION
權限/觸發器/擴充屬性遺失視 SSMS 版本行為可能不同

最佳實務建議

  1. 生產環境嚴禁使用設計師修改結構
  2. 2. 使用 T-SQL ALTER TABLE 明確控制每一步 3. 變更前:完整備份、評估影響範圍 4. 大表變更:考慮 SWITCH 分區、線上重建 (企業版)、維護時段 5. 設計師僅供開發/測試環境快速原型

常見 ALTER TABLE 範例

-- 新增欄位 (末尾,通常不重建)
ALTER TABLE dbo.MyTable ADD NewCol VARCHAR(50) NULL;

-- 變更資料類型 (需確認資料相容)
ALTER TABLE dbo.MyTable ALTER COLUMN ExistingCol VARCHAR(100) NOT NULL;

-- 新增外來鍵 (WITH NOCHECK 避免驗證既有資料)
ALTER TABLE dbo.ChildTable 
ADD CONSTRAINT FK_Child_Parent 
FOREIGN KEY (ParentID) REFERENCES dbo.ParentTable(ID)
WITH NOCHECK;  -- 後續可用 CHECK CONSTRAINT 啟用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved