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

SQL Server 資料庫規則 完整解析:建立、綁定與最佳實務

     編輯:關於SqlServer

「規則」 是 SQL Server 早期提供的資料完整性機制,用於限制資料表欄位或使用者自訂資料類型 (UDT) 可接受的值域。雖然 CHECK 約束 為 ANSI SQL 標準且功能更強,但規則仍具備「一次定義、多處重用」與「可直接套用至 UDT」的獨特優勢。本文系統說明規則的建立、檢視、綁定/解除、刪除及實務考量。

核心特性對比

特性規則CHECK 約束
標準化T-SQL 專有ANSI SQL-92 標準
作用範圍資料表欄位、UDT僅資料表欄位
重用性高(單一規則可綁定多欄位/UDT)低(屬單一資料表定義)
多條件並存一欄位僅能綁一規則一欄位可建多個 CHECK
刪除資料表影響規則物件保留約束隨資料表刪除

建立規則

T-SQL 指令

CREATE RULE rule_name
AS condition_expression
  • condition_expression:任何合法的 WHERE 子句運算式,可含算術/關係/邏輯運算子、IN、LIKE、BETWEEN 等述詞。
  • 關鍵限制:運算式必須以 @ 開頭,代表待驗證的值(如 @value > 0、@code LIKE 'A%'、@status IN (1,2,3))。

企業管理器圖形化建立

  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 ... 再綁定

實務建議與遷移策略

  1. 新專案優先用 CHECK 約束:標準化、可多條件、支援跨欄位驗證(如 CHECK (StartDate < EndDate))。
  2. 需跨資料表/UDT 共用驗證邏輯:考慮規則,或改用「標量函數 + CHECK 約束呼叫函數」模式,兼具標準與重用。
  3. 現有規則維護:文件化所有綁定關係,修改時批次產生 sp_unbindrule/sp_bindrule 腳本,避免遺漏。
  4. 相容性層級:SQL Server 2016+ 仍支援規則,但文件標示為「未來版本移除」,長期規劃應逐步改寫為 CHECK 或觸發器。

善用規則的重用特性可減少重複定義,但務必權衡維護成本與未來相容性,制定明確的完整性策略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved