5. SQL Server中的规则对象
  规则对象的作用与CHECK约束相同,它检查用户为其所关联列或所绑定的用户定义数据类型列的输入可接受值的有效性。
 ● 一个规则定义可以出现在WHERE子句的表达式中;
 ● 每个列或每个用户定义数据类型只能绑定一个规则;
 ● 一个规则可以关联到一列或几列。
  规则对象和CHECK约束有些类似,但两者存在一些区别,CHECK约束是在用CREATE TABLE 或 ALTER TABLE语句定义表结构时定义,它与表定义存储在一起,所以,在删除表时,CHECK约束被自动删除。而规则对象则需要使用CREATE RULE语句定义,它作为一种数据库对象单独存储,所以它可以被多次应用于不同列或用户定义的数据类型。在删除表时不能删除规则对象,而需要使用DROP RULE语句删除。

  ◆创建规则对象
  ◆应用规则对象
  ◆ 解除和删除规则对象

 (1) 创建规则对象
  在T_SQL中,创建规则对象的语句格式:
  CREATE RULE [owner.] rule_name
  AS condition_expression
  其中:
  rule_name :规则名称。
  condition_expression:规则定义的条件。condition_expression表达式可以与所有有效的WHERE子句所指定的条件相同。它用一个局部变量代表INSERT语句或UPDATE语句所输入的数值。
  AS子句的变量名必须以@开头,而且要与所关联的列名或用户定义数据类型相同。

例题
 例1, 下面语句所创建的规则限制用户输入的学生年龄在指定的范围为大于等于14岁而小于等于35岁。如下定义:
  CREATE RULE S_age_rule
  AS >= 14 @sage <= 35
例题
 例2,下面语句所创建的规则限制用户输入的字符串只能在指定的列表条目中,即学生的课程必须是在集合('网络','数据库','编译原理','操作系统','软件工程','JAVA')中,@s_course为存放课程的局部变量。定义如下:CREATE RULE S_course_rule
  AS
  @s_course IN('网络','数据库','编译原理','操作系统','软件工程','JAVA')
  
 (2) 绑定和应用规则对象
  创建规则对象后,必须使用系统存储过程sp_bindrule把规则对象绑定到一个列或用户定义的数据类型才能起作用。语句格式:
  sp_bindrule rulename , objname [, futureonly]
  rulename:是规则名称
  objname:是规则所关联的表的列名或用户定义的数据类型名称. 如果Objname的格式为'表名.列名'说明是列名,否则视为用户定义的数据类型名。
  futureonly:只用于用户定义数据类型。且只对未来的值起作用,不影响已经存在的值。

  例如,以正确的课程集合值绑定学生课程列。
  sp_bindrule S_course_rule 'C.course'
 (3) 解除和删除规则对象
  要删除规则对象时,必须先解除规则对象与指定列或用户定义数据类型之间的关联。当一个规则对象与多个列或多个用户定义的数据类型相关联时,要逐一用sp_unbindrule 解除。解除规则与相应对象关联的格式:
  sp_unbindrule objname [, futureonly]
  futureonly:只用于用解除与户定义数据类型相关 联的规则。且只对未来的值起作用,不影响 已存在的数据类型列与规则之间的关联值。
  Objname: 相关联的列名或用户定义的数据类型名。


  例如, 解除学生课程C.course列与课程规则S_course_rule的关联。
   sp_unbindrule 'C.course'
 ● 删除规则对象的语句格式:
   DROP RULE [owner.] rule_name
   一个DROP 语句可以同时删除多个规则对象。

  例如,删除课程规则S_course_rule的语句如下:DROP RULE S_course_rule
  数据完整性方法的比较如图4-27


  图4-27 数据完整性方法的比较

数据完整性方法 功能 开支 事务之前或者之后
约束 之前
触发器 之后/之后
缺省和规则对象 之前