创建称为规则的对象。当绑定到列或用户定义数据类型时,规则将指定可以插入到列中的可接受的值。规则是一种向后兼容的功能,执行一些与检查约束相同的功能。CHECK 约束是使用 ALTER 或 CREATE TABLE 的 CHECK 关键字创建的,是对列中的值进行限制的首选标准方法(可以对一列或多列定义多个约束)。列或用户定义数据类型只能有一个绑定的规则。但是,列可以同时具有规则和一个或多个与其关联的检查约束。在这种情况下,将检查所有限制。
语法
CREATE RULE rule
AS condition_expression
参数
rule
是新规则的名称。规则名称必须符合标识符规则。可以选择是否指定规则所有者的名称。
condition_expression
是定义规则的条件。规则可以是 WHERE 子句中任何有效的表达式,并且可以包含诸如算术运算符、关系运算符和谓词(如 IN、LIKE、BETWEEN)之类的元素。规则不能引用列或其它数据库对象。可以包含不引用数据库对象的内置函数。
condition_expression 包含一个变量。每个局部变量的前面都有一个 @ 符号。该表达式引用通过 UPDATE 或 INSERT 语句输入的值。在创建规则时,可以使用任何名称或符号表示值,但第一个字符必须是 @ 符号。
注释
在单个批处理中,CREATE RULE 语句不能与其它 Transact-SQL 语句组合使用。规则不适用于在创建规则时已存在于数据库中的数据,而且规则不能绑定到系统数据类型。规则只能在当前的数据库中创建。创建规则后,执行 sp_bindrule 可将规则绑定到列或用户定义数据类型。
规则必须与列的数据类型兼容。规则不能绑定到 text、image 或 timestamp 列。一定要用单引号 (') 将字符和日期常量引起来,在二进制常量前加 0x。例如,不能将 "@value LIKE A%" 用作数字列的规则。如果规则与其所绑定的列不兼容,Microsoft® SQL Server™ 将在插入值时(而不是在绑定规则时)返回错误信息。
对于用户定义数据类型,只有尝试在该类型的数据库列中插入值,或更新该类型的数据库列时,绑定到该类型的规则才会激活。因为规则不检验变量,所以在向用户定义数据类型的变量赋值时,不要赋予绑定到该数据类型的列的规则所拒绝的值。
若要获得关于规则的报表,请使用 sp_help。若要显示某条规则的文本,请以该规则的名称作为参数来执行存储过程 sp_helptext。若要重命名规则,请使用 sp_rename。
要创建与原有规则同名的新规则,必须在创建新规则之前将原有规则除去(使用 DROP RULE),而在除去规则之前,必须首先解除绑定(使用 sp_unbindrule)。使用 sp_unbindrule 解除规则与列的绑定。
可以在不解除原有绑定的情况下将新规则绑定到列或数据类型;新规则将替代原有规则。绑定到列的规则总是优先于绑定到用户定义数据类型的规则。将规则绑定到列时,该规则将替换已经绑定到该列的用户定义数据类型的规则。但是,将规则绑定到用户定义数据类型时,该规则不会替换绑定到该数据类型的列的规则。下表显示了当将规则绑定到已经存在规则的列和用户定义数据类型时,规则生效的优先顺序。
如果列同时有默认值和规则与之关联,则默认值必须满足规则的定义。与规则冲突的默认值永远不能插入列。每次试图插入这样的默认值时,SQL Server 都会生成错误信息。
说明
SQL Server 是将空字符串解释为单个空格还是真正的空字符串取决于 sp_dbcmptlevel 的设置。如果兼容级别小于或等于 65,SQL Server 就将空字符串解释为单个空格。如果兼容级别等于 70,则 SQL Server 将空字符串解释为空字符串。
权限
CREATE RULE 权限默认授予 sysadmin 固定服务器角色成员和 db_ddladmin 和 db_owner 固定数据库角色成员。sysadmin、db_owner 和 db_securityadmin 角色的成员可以将权限转让给其他用户。
示例
A. 范围规则
下例创建一个规则,用以限制插入该规则所绑定的列中的整数范围。
CREATE RULE range_rule
AS
@range = $1000 AND @range
B. 列表规则
下例创建一个规则,用以将输入到该规则所绑定的列中的实际值限制为只能是该规则中列出的值。
CREATE RULE list_rule
AS
@list IN ('1389', '0736', '0877')
C. 模式规则
下例创建一个遵循这种模式的规则:任意两个字符的后面跟一个连字符和任意多个字符(或没有字符),并以 0 到 9 之间的整数结尾。
CREATE RULE pattern_rule
AS
@value LIKE '_ _-%[0-9]'