规则和CHECK约束可以同时使用,表的列可以有一个规则及多个CHECK约束。规则与CHECK约束在功能上相似,使用 CHECK 约束是限制列值的首选标准方法,CHECK 约束比规则更简明,但CHECK约束不能直接作用于用户定义数据类型,它们在使用上是有所区别的。
● CHECK约束是在CREATE TABLE或ALTER TABLE语句中定义的,嵌入了被定义的表结构,在删除表的时候CHECK约束也就随之被删除。
● 规则需要用CREATE RULE语句定义后才能使用,是独立于表之外的数据库对象,删除表并不能删除规则,需要用DROP RULE语句才能删除
-------------------创建规则
使用T-SQL语句中的CREATE RULE语句在当前数据库就中创建规则,其语法格式如下:
CREATE RULE [ schema_name . ] rule_name
AS condition_expression
[ ; ]
说明:
● rule_name:新规则的名称。
● condition_expression:定义规则的条件。规则可以是 WHERE 子句中任何有效的表达式,并且可以包括诸如算术运算符、关系运算符和谓词(如 IN、LIKE、BETWEEN等)。
condition_expression 包括一个变量,每个变量的前面都有一个@符号,变量的名称应与规则关联的列或用户定义的数据类型具有相同的符号。
例如:创建成绩表规则 grade_rule
USE stsc
GO
CREATE RULE grade_rule
AS @grade between 0 and 100
GO
创建出生日期规则
stbirthday_rule
USE stsc
GO
CREATE RULE stbirthday_rule
AS @stbirthday>='1990-01-01' and @stbirthday<='1996-01-01'
GO
-------------------查看规则
查看规则使用系统存储过程sp_helptext,其语法格式如下:
sp_helptext [ @objname = ] 'name' [ , [ @columnname = ] computed_column_name ]
说明:
[ @objname = ] 'name'子句指明对象名称。sp_helptext查看的对象可以是当前数据库的规则、默认值、触发器、未加密的存储过程等。
例如,查看规则 grade_rule的文本信息
USE stsc
GO
EXECUTE sp_helptext grade_rule
GO
-------------------绑定规则
使用系统存储过程 sp_bindrule 可以绑定一个规则到表的一个列或一个用户定义数据类型上,其语法格式如下:sp_bindrule [ @rulename = ] 'rule' ,
[ @objname = ] 'object_name'
[ , [ @futureonly = ] 'futureonly_flag' ]
说明:
● [ @rulename =] 'rule:指定规则的名称。
● [ @objname = ] 'object_name':要绑定规则的表的列或用户定义数据类型。
● [ @futureonly = ] 'futureonly_flag':仅当将规则绑定到用户定义数据类型时才能使用。
例如:将规则grade_rule绑定到score表上的grade列上:
USE stsc
GO
EXECUTE sp_bindrule grade_rule,'score.grade'
GO
-------------------解除规则
解除规则使用系统存储过程sp_unbindrule,其语法格式如下:
sp_unbindrule [ @objname = ] 'object_name'
[ , [ @futureonly = ] 'futureonly_flag' ]
说明:
[ @objname = ] 'name'为要取消规则绑定的表和列或用户定义数据类型的名称。
例如:解除绑定到score表的grade列上规则
USE stsc
GO
EXECUTE sp_unbindrule'score.grade'
GO
-------------------删除规则
删除规则使用 DROP RULE语句,用于从当前数据库中删除一 个或多个规则,其语法格式如下:DROP RULE { [ schema_name . ] rule_name } [ ,...n ] [ ; ]
例如:删除规则stbirthday_rule, charater_rule。
USE stsc
GO
DROP RULE stbirthday_rule,character_rule
GO