嘗試修改資料行型別或屬性時,若該欄位被預設約束、檢查約束、外鍵 或計算欄位 參考,SQL Server 會拋出錯誤:
Msg 5074, Level 16, State 1: The object 'DF__Table__Col__xxxx' is dependent on column 'ColName'.
Msg 4922, Level 16, State 9: ALTER TABLE ALTER COLUMN ColName failed because one or more objects access this column.
系統自動建立的預設約束(DF_...)綁定在目標欄位上,ALTER COLUMN 需先移除所有相依物件。
-- 1. 查詢欄位綁定的預設約束名稱
DECLARE @df_name sysname;
SELECT @df_name = dc.name
FROM sys.default_constraints dc
JOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id
WHERE c.object_id = OBJECT_ID('dbo.TableName') AND c.name = 'ColName';
-- 2. 動態刪除約束
IF @df_name IS NOT NULL
BEGIN
DECLARE @sql nvarchar(max) = N'ALTER TABLE dbo.TableName DROP CONSTRAINT ' + QUOTENAME(@df_name);
EXEC sp_executesql @sql;
END
-- 3. 執行原本的 ALTER COLUMN
ALTER TABLE dbo.TableName ALTER COLUMN ColName NEW_TYPE(NULL/NOT NULL);
ALTER TABLE dbo.TableName DROP CONSTRAINT DF__Explicit_Name(從錯誤訊息複製確切約束名)。CONSTRAINT DF_Table_Col DEFAULT (0),避免系統產生難以辨識的名稱。sp_help 'TableName' 或查詢 sys.default_constraints 確認相依性。掌握「查約束 → 刪約束 → 改欄位 → 重建約束」標準流程,即可從容應對所有 Msg 5074/4922 類錯誤。