訊息 5074,層級 16,狀態 1,第 2 行 物件 'DF__DDCZJLB_M__DDCZJ__5BBA8402' 相依於欄位 'DDCZJLB_GROUPID'。 訊息 4922,層級 16,狀態 9,第 2 行 由於一或多個物件存取此欄位,ALTER TABLE ALTER COLUMN DDCZJLB_GROUPID 失敗。
**原因**:該欄位存在 **預設約束(Default Constraint)**、檢查約束、外鍵參考、計算欄位、索引或視圖相依,SQL Server 禁止直接變更欄位定義。
DROP CONSTRAINT + ALTER COLUMN + ADD CONSTRAINT 腳本。DECLARE @constraint_name SYSNAME;
SELECT @constraint_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.YourTable') AND c.name = 'YourColumn';
IF @constraint_name IS NOT NULL
BEGIN
DECLARE @sql NVARCHAR(MAX) = N'ALTER TABLE dbo.YourTable DROP CONSTRAINT ' + QUOTENAME(@constraint_name);
EXEC sp_executesql @sql;
END
ALTER TABLE dbo.YourTable ALTER COLUMN YourColumn NEW_DATA_TYPE(...);
ALTER TABLE dbo.YourTable ADD CONSTRAINT DF_YourTable_YourColumn DEFAULT (DEFAULT_VALUE) FOR YourColumn;
若約束極多或無法識別,可嘗試:
SINGLE_USER WITH ROLLBACK IMMEDIATE 強制斷開所有連線。ALTER TABLE ... DROP CONSTRAINT ... 逐一清理。MULTI_USER。ALTER DATABASE YourDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE; -- 執行 DROP CONSTRAINT / ALTER COLUMN ALTER DATABASE YourDB SET MULTI_USER;
| 物件類型 | 系統檢視 | 查詢範例 |
|---|---|---|
| 預設約束 | sys.default_constraints | 上方步驟 1 |
| 檢查約束 | sys.check_constraints | parent_object_id/parent_column_id 同理 |
| 外鍵參考 | sys.foreign_key_columns | referenced_object_id = OBJECT_ID('Table') |
| 計算欄位 | sys.columns (is_computed=1) | definition 含目標欄位 |
| 索引/統計 | sys.indexes / sys.stats | 包含該欄位需先 DROP INDEX |
| 視圖/函數 | sys.sql_expression_dependencies | referencing_id = OBJECT_ID('View') |
CONSTRAINT DF_Table_Col DEFAULT ...,避免系統產生難以辨識的亂碼名稱。SELECT * INTO Table_Bak FROM Table 或完整資料庫備份。