1. 程式人生 > 實用技巧 >(4.46)sql server中的rule

(4.46)sql server中的rule

【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%”不能用作數字列的規則。

   規則不能繫結到textntextimagevarchar(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)

您可以將新規則繫結到列或資料型別,而無需取消繫結前一條;新規則將覆蓋前一條。繫結到列的規則始終優先於繫結到別名資料型別的規則。將規則繫結到列將替換已經繫結到該列的別名資料型別的規則。但是,將規則繫結到資料型別不會替換繫結到該別名資料型別的列的規則。下表顯示了將規則繫結到已存在規則的列和別名資料型別時生效的優先順序。

表格1
新規則必然繫結到

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

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

https://www.cnblogs.com/xy-online/articles/10605915.html

https://bbs.csdn.net/topics/392058466?list=lz