【1】create rule
作用:
規則是對存儲的數據表中的列或者用戶自定義數據類型中的值的約束。
規則可以在創建表之后單獨對列進行約束。
規則可以同時作用於多個數據列。
【1.1】基本形式
CREATE RULE [ schema_name . ] rule_name AS condition_expression [ ; ]
schema_name
是規則所屬的架構的名稱。
rule_name
是新規則的名稱。規則名稱必須符合標識符規則。指定規則所有者名稱是可選的。
condition_expression
是定義規則的一個或多個條件。規則可以是在WHERE子句中有效的任何表達式,並且可以包括諸如算術運算符,關系運算符和謂詞之類的元素(例如,IN,LIKE,BETWEEN)。規則不能引用列或其他數據庫對象。可以包含不引用數據庫對象的內置函數。不能使用用戶定義的功能。
condition_expression
包含一個變量。每個局部變量之前都有@符號(@)。該表達式引用用UPDATE或INSERT語句輸入的值。創建規則時,可以使用任何名稱或符號來表示值,但第一個字符必須為at符號(@)
【1.2】權限與限制
限制:
(1)CREATE RULE不能與其他Transact-SQL語句合並在一個批處理中。
(2)只能在當前數據庫中創建規則。創建規則后,執行sp_bindrule將規則綁定到列或別名數據類型。規則必須與列數據類型兼容。例如,“ @ value LIKE A%”不能用作數字列的規則。
規則不能綁定到text,ntext,image,varchar(max),nvarchar(max),varbinary(max),xml,CLR用戶定義類型或時間戳列。規則不能綁定到計算列。
(3)字符和日期常量用單引號(')括起來,二進制常量前面加0x。如果該規則與其綁定的列不兼容,則在插入值時,SQL Server數據庫引擎會返回一條錯誤消息,但在綁定該規則時,則不會返回錯誤消息。
(4)僅當您嘗試向別名數據類型的數據庫列中插入值或更新值時,才會激活與別名數據類型綁定的規則。由於規則不測試變量,因此請勿為別名數據類型變量分配值,該值將被綁定到相同數據類型的列的規則拒絕。
(5)要獲取有關規則的報告,請使用 sp_help。若要顯示規則的文本,請以規則名稱為參數執行 sp_helptext 。要重命名規則,請使用 sp_rename。
在創建具有相同名稱的新規則之前,必須使用 DROP RULE 刪除該規則,並且在刪除該規則之前必須使用 sp_unbindrule 取消綁定該規則。要從列中取消綁定規則,請使用 sp_unbindrule。
(6)
您可以將新規則綁定到列或數據類型,而無需取消綁定前一條;新規則將覆蓋前一條。綁定到列的規則始終優先於綁定到別名數據類型的規則。將規則綁定到列將替換已經綁定到該列的別名數據類型的規則。但是,將規則綁定到數據類型不會替換綁定到該別名數據類型的列的規則。下表顯示了將規則綁定到已存在規則的列和別名數據類型時生效的優先級。
新規則必然 | 綁定到 別名數據類型的舊規則 |
綁定到 Column的舊規則 |
---|---|---|
別名數據類型 | 舊規則被替換 | 沒變 |
柱 | 舊規則被替換 | 舊規則被替換 |
如果列中既有默認值又有與其關聯的規則,則該默認值必須在該規則定義的域內。永遠不會插入與規則沖突的默認值。每次嘗試插入這樣的默認值時,SQL Server數據庫引擎都會生成一條錯誤消息。
權限:
要至少執行CREATE RULE,用戶必須在當前數據庫中具有CREATE RULE權限,並在創建規則的模式上具有ALTER權限。
【2】創建rule 舉例
A.創建一個帶范圍的規則
以下示例創建一個規則,該規則限制插入此規則所綁定的一個或多個列中的整數的范圍。
CREATE RULE range_rule AS @range>= $1000 AND @range <$20000;
B.使用列表創建規則
下面的示例創建一個規則,該規則將輸入到一個或多個列(綁定到該規則)中的實際值限制為僅該規則中列出的值。
CREATE RULE list_rule AS @list IN ('1389', '0736', '0877');
C.用模式創建規則
以下示例創建了一個規則,該規則遵循一個由兩個字符組成的模式,后接連字符(-
),任意數量的字符或不包含任何字符,並以從0
到的整數結尾9
。
CREATE RULE pattern_rule AS @value LIKE '__-%[0-9]'
【3】整體使用最佳實踐
【3.1】使用規則
規則是對存儲的數據表中的列或者用戶自定義數據類型中的值的約束。
規則可以在創建表之后單獨對列進行約束。
規則可以同時作用於多個數據列。
創建規則
USE DB_NAME GO CREATE RULE rule_name AS @value > 0 --創建一個規則,使用該規則的列值必須大於0
綁定規則
--綁定 EXEC sp_bindrule 'rule_name', 'Table_Name.FieldName' --解綁 EXEC sp_unbindrule 'Table_Name.FieldName'
查看規則
EXEC sp_help 'rule_name' --詳情 EXEC sp_helptext 'rule_name'
刪除規則
DROP RULE rule_name
【4】使用默認值規則
創建默認值
CREATE DEFAULT default_date AS GETDATE()
綁定默認值
--綁定 EXEC sp_bindefault 'default_date', 'table_Name.FieldName' --解綁 EXEC sp_unbindefault 'table_Name2.FieldName'
查看默認值
EXEC sp_help default_date --詳情 EXEC sp_helptext default_date
刪除默認值
DROP DEFAULT default_date
【5】查看某個表綁定了哪些rule,查看一共有哪些rule
create table test(id int, name varchar(10)) go CREATE RULE ARule AS @A BETWEEN 0 AND 50000 go EXEC sp_bindrule 'ARule', 'test.id' go select object_name(object_id) oname , name, column_id, object_name(rule_object_id) rule_name from sys.columns where object_id = object_id('test') go drop table test go drop RULE ARule go
【參考文檔】
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-rule-transact-sql?view=sql-server-ver15