_
原則:唯一性、可讀性、長度 ≤ 128、避免保留字、Schema 前綴防跨 Schema 衝突。
自動化修正腳本:為現有無名約束重命名
DECLARE @Sql NVARCHAR(MAX) = N'';
SELECT @Sql += N'
EXEC sp_rename ''' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + N'.' + QUOTENAME(name) + N''', ''' +
CASE type
WHEN 'PK' THEN 'PK_' + OBJECT_SCHEMA_NAME(parent_object_id) + '_' + OBJECT_NAME(parent_object_id)
WHEN 'F' THEN 'FK_' + OBJECT_SCHEMA_NAME(parent_object_id) + '_' + OBJECT_NAME(parent_object_id) + '_' + OBJECT_NAME(referenced_object_id)
WHEN 'UQ' THEN 'UQ_' + OBJECT_SCHEMA_NAME(parent_object_id) + '_' + OBJECT_NAME(parent_object_id) + '_' + REPLACE(col_name(parent_object_id, parent_column_id), ' ', '_')
WHEN 'C' THEN 'CK_' + OBJECT_SCHEMA_NAME(parent_object_id) + '_' + OBJECT_NAME(parent_object_id) + '_' + REPLACE(name, ' ', '_')
WHEN 'D' THEN 'DF_' + OBJECT_SCHEMA_NAME(parent_object_id) + '_' + OBJECT_NAME(parent_object_id) + '_' + REPLACE(col_name(parent_object_id, parent_column_id), ' ', '_')
END + N''', ''OBJECT'';' + CHAR(13) + CHAR(10)
FROM sys.objects
WHERE type IN ('PK','F','UQ','C','D')
AND is_ms_shipped = 0
AND name LIKE '__%' ESCAPE '_' -- 系統生成名稱特徵:雙下劃線開頭
AND parent_object_id IN (OBJECT_ID('dbo.YourTable1'), OBJECT_ID('dbo.YourTable2')); -- 限定範圍
PRINT @Sql; -- 審核後執行
工具鏈集成
- SSDT / DACPAC:強制要求顯式命名,編譯期即報錯。
- Flyway / Liquibase:變更集中寫入 `CONSTRAINT `,版本控制天然一致。
- Redgate SQL Compare / Schema Compare:忽略系統名稱差異選項 (但建議源頭治理)。
- Git Hook / CI Gate**:提交腳本掃描 `PRIMARY KEY`/`FOREIGN KEY`/`CHECK`/`DEFAULT` 後無 `CONSTRAINT` 關鍵字則阻斷。
總結
**「約束必須顯式命名」**是數據庫版本化、自動化部署、可觀測性的基石。成本極低 (僅多寫 `CONSTRAINT PK_...`),收益極大 (消除跨環境漂移、遷移腳本穩定、日誌可讀、文檔同步)。請立即納入團隊編碼規範與 CI 門禁。
- 上一篇文章: sp_stored_procedures + sp_helptext:秒級找回遺忘存儲過程並閱讀源碼
- 下一篇文章: SET vs SELECT 賦值:為什麼標量子查詢必須用 SET 避免靜默多行錯誤
Copyright ©
程式碼之家 All Rights Reserved