CREATE RULE (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Analytics Platform System (PDW)

建立一個稱為規則的物件。 當繫結到資料行或別名資料型別時,規則會指定能夠插入這個資料行的可接受的值。

重要

SQL Server 的未來版本將移除此功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 我們建議您改用檢查條件約束。 CHECK 條件約束是利用 CREATE TABLE 或 ALTER TABLE 的 CHECK 關鍵字來建立的。 如需詳細資訊,請參閱 Unique Constraints and Check Constraints

資料行或別名資料型別只能有一個繫結的規則。 不過,資料行可以同時有一個規則以及一個或多個相關聯的檢查條件約束。 在這個情況下,會評估所有限制。

Transact-SQL 語法慣例 (部分機器翻譯)

Syntax

CREATE RULE [ schema_name . ] rule_name   
AS condition_expression  
[ ; ]  

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

schema_name
這是規則所屬的結構描述名稱。

rule_name
這是新規則的名稱。 規則名稱必須符合識別碼的規則。 您可以選擇性地指定規則擁有者名稱。

condition_expression
這是定義規則的一個或多個條件。 規則可以是 WHERE 子句中任何有效的運算式,可以包括算術運算子、關係運算子和述詞 (如 IN、LIKE、BETWEEN) 之類的元素。 規則不能參考資料行或其他資料庫物件。 未參考資料庫物件的內建函數可以包括在內。 無法使用使用者自訂函數。

condition_expression包括一個變數。 每個區域變數前面都會有 @ 記號 ( @ )。 這個運算式參考 UPDATE 或 INSERT 陳述式所輸入的值。 當建立規則時,您可以使用任何名稱或符號來代表值,但第一個字元必須是 @ 記號 ( @ )。

注意

請避免建立使用別名資料型別之運算式的規則。 雖然您可以建立使用別名資料型別之運算式的規則,但在規則繫結到資料行或別名資料型別之後,當參考運算式時,會無法編譯運算式。

備註

CREATE RULE 無法在單一批次中與其他 Transact-SQL 陳述式結合。 規則不適用於建立規則時已在資料庫中的資料,規則無法繫結到系統資料類型。

規則只能建立在目前資料庫中。 建立好規則之後,請執行 sp_bindrule,將規則繫結到資料行或別名資料類型。 規則必須相容於資料行資料類型。 例如,"@value LIKE A%" 不能用來做為數值資料行的規則。 規則無法繫結到 textntextimagevarchar (max)nvarchar(max)varbinary(max)xml、CLR 使用者定義型別或 timestamp 資料行。 規則無法繫結到計算資料行。

請用單引號 (') 括住字元和日期常數,二進位常數前面要附加 0x。 如果規則與所繫結的資料行不相容,SQL Server 資料庫引擎會在插入值時傳回一則錯誤訊息,不是在繫結規則時。

只有在您試圖將值插入別名資料型別的資料庫資料行或更新這個資料行時,才會啟動繫結到別名資料型別的規則。 由於規則不會測試變數,因此,不會將值指派給繫結到相同資料類型之規則所拒絕的別名資料型別變數。

若要取得規則的報表,請使用 sp_help。 若要顯示規則的文字,請將規則名稱設為參數來執行 sp_helptext。 若要重新命名規則,請使用 sp_rename

在建立同名的新規則之前,您必須先使用 DROP RULE 來卸除舊規則,在卸除舊規則之前,必須先使用 sp_unbindrule 來解除它的繫結。 若要解除規則和資料行的繫結,請使用 sp_unbindrule

您可以在未解除先前繫結的情況下,將新規則繫結到資料行或資料類型;新規則會覆寫先前的規則。 繫結到資料行的規則,一律優先於繫結到別名資料型別的規則。 將規則繫結到資料行,會取代已繫結到這個資料行的別名資料型別之規則。 但將規則繫結到資料類型,並不會取代繫結到這個別名資料型別之資料行的規則。 下表顯示將規則繫結到資料行,或繫結到規則已存在的別名資料型別時,所採用的優先順序。

新規則繫結到 舊規則繫結到

別名資料型別
舊規則繫結到

資料行
別名資料型別 取代舊規則 沒有變更
資料行 取代舊規則 取代舊規則

如果資料行有預設值及其相關聯的規則,預設值必須在規則所定義的網域內。 永遠不會插入與規則衝突的預設值。 SQL Server Database Engine 每次嘗試插入這類預設值時,都會產生一則錯誤訊息。

權限

若要執行 CREATE RULE,使用者至少必須有目前資料庫中的 CREATE RULE 權限,以及正在建立規則之結構描述的 ALTER 權限。

範例

A. 利用範圍來建立規則

下列範例會建立一個規則來限制插入這個規則所繫結之一個或多個資料行的整數範圍。

CREATE RULE range_rule  
AS   
@range>= $1000 AND @range <$20000;  

B. 利用清單來建立規則

下列範例會建立一個規則,將輸入 (這個規則所繫結的) 資料行之實際值限制在規則所列出的值。

CREATE RULE list_rule  
AS   
@list IN ('1389', '0736', '0877');  

C. 利用模式建立規則

下列範例會建立一個遵照下列模式的規則:任兩個字元後面接著連字號 (-),再接著任意數目的字元或不接任何字元,再以 09 的整數做為結尾。

CREATE RULE pattern_rule   
AS  
@value LIKE '__-%[0-9]'  

另請參閱

ALTER TABLE (Transact-SQL)
CREATE DEFAULT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DROP DEFAULT (Transact-SQL)
DROP RULE (Transact-SQL)
運算式 (Transact-SQL)
sp_bindrule (Transact-SQL)
sp_help (Transact-SQL)
sp_helptext (Transact-SQL)
sp_rename (Transact-SQL)
sp_unbindrule (Transact-SQL)
WHERE (Transact-SQL)