「規則」 是 SQL Server 早期提供的資料完整性機制,用於限制資料表欄位或使用者自訂資料類型 (UDT) 可接受的值域。雖然 CHECK 約束 為 ANSI SQL 標準且功能更強,但規則仍具備「一次定義、多處重用」與「可直接套用至 UDT」的獨特優勢。本文系統說明規則的建立、檢視、綁定/解除、刪除及實務考量。
| 特性 | 規則 | CHECK 約束 |
|---|---|---|
| 標準化 | T-SQL 專有 | ANSI SQL-92 標準 |
| 作用範圍 | 資料表欄位、UDT | 僅資料表欄位 |
| 重用性 | 高(單一規則可綁定多欄位/UDT) | 低(屬單一資料表定義) |
| 多條件並存 | 一欄位僅能綁一規則 | 一欄位可建多個 CHECK |
| 刪除資料表影響 | 規則物件保留 | 約束隨資料表刪除 |
CREATE RULE rule_name
AS condition_expression
condition_expression:任何合法的 WHERE 子句運算式,可含算術/關係/邏輯運算子、IN、LIKE、BETWEEN 等述詞。@ 開頭,代表待驗證的值(如 @value > 0、@code LIKE 'A%'、@status IN (1,2,3))。@ 前綴)。規則建立後不自動生效,必須以系統預存程序綁定至目標欄位或 UDT:
-- 綁定至資料表欄位
EXEC sp_bindrule 'rule_name', 'schema.table.column'
-- 綁定至使用者自訂資料類型
EXEC sp_bindrule 'rule_name', 'udt_name'
-- 解除綁定
EXEC sp_unbindrule 'schema.table.column' -- 或 'udt_name'
注意:綁定前若欄位已有資料,不會追溯驗證;新增/修改資料時始觸發規則檢查。
OBJECT_DEFINITION(OBJECT_ID('rule_name')) 取得原始碼。SELECT o.name AS rule_name, c.name AS column_name, t.name AS table_name
FROM sysobjects o
JOIN syscolumns c ON o.id = c.domain
JOIN sysobjects t ON c.id = t.id
WHERE o.xtype = 'R'
規則不支援 ALTER RULE,需「刪除重建」:
-- 1. 先解除所有綁定
EXEC sp_unbindrule 'table.column' -- 逐一解除
-- 2. 刪除規則
DROP RULE rule_name
-- 3. 重新 CREATE RULE ... 再綁定
CHECK (StartDate < EndDate))。sp_unbindrule/sp_bindrule 腳本,避免遺漏。善用規則的重用特性可減少重複定義,但務必權衡維護成本與未來相容性,制定明確的完整性策略。