CREATE RULE (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Analytics Platform System (PDW)

创建名为规则的对象。 当绑定到列或别名数据类型时,使用规则指定可以插入到列中的可接受的值。

重要

在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 建议您改用检查约束。 检查约束是使用 CREATE TABLE 或 ALTER TABLE 的 CHECK 关键字创建的。 有关详细信息,请参阅 Unique Constraints and Check Constraints

列或别名数据类型只能被绑定一个规则。 不过,列可以同时有一个规则以及一个或多个检查约束与其相关联。 在这种情况下,将评估所有限制。

Transact-SQL 语法约定

语法

CREATE RULE [ schema_name . ] rule_name   
AS condition_expression  
[ ; ]  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

schema_name
规则所属架构的名称。

rule_name
新规则的名称。 规则名称必须符合标识符规则。 根据需要,指定规则所有者名称。

condition_expression
定义规则的条件。 规则可以是 WHERE 子句中任何有效的表达式,并且可以包括诸如算术运算符、关系运算符和谓词(如 IN、LIKE、BETWEEN)这样的元素。 规则不能引用列或其他数据库对象。 可以包括不引用数据库对象的内置函数。 不能使用用户定义函数。

condition_expression 包括一个变量。 每个局部变量前面都有一个 at 符号 (@)。 该表达式引用通过 UPDATE 或 INSERT 语句输入的值。 在创建规则时,可以使用任何名称或符号表示值,但第一个字符必须是 at 符号 (@)。

备注

请避免对使用别名数据类型的表达式创建规则。 虽然可以对使用别名数据类型的表达式创建规则,但在将规则绑定到列或别名数据类型后,表达式被引用时将无法对其进行编译。

备注

不能在单个批处理中将 CREATE RULE 语句与其他 Transact-SQL 语句组合在一起。 规则不适用于在创建规则时已存在于数据库中的数据,而且规则不能绑定到系统数据类型。

规则只能在当前的数据库中创建。 创建规则后,执行 sp_bindrule 可将规则绑定到列或别名数据类型。 规则必须与列数据类型兼容。 例如,不能将 "@value LIKE A%" 用作数字列的规则。 无法将规则绑定到 text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)、xml、CLR 用户定义类型或 timestamp 列。 无法将规则绑定到计算列。

用单引号 (') 将字符和日期常量括起来,并在二进制常量前加 0x。 如果规则与其绑定到的列不兼容,则 SQL Server 数据库引擎在插入值时(但不是在绑定规则时)会返回一个错误消息。

只有当尝试在别名数据类型的数据库列中插入值或进行更新时,绑定到别名数据类型的规则才会激活。 因为规则不检验变量,所以不要为别名数据类型变量赋予会被绑定到同一数据类型的列的规则所拒绝的值。

若要获取关于规则的报告,请使用 sp_help。 若要显示某条规则的文本,请以该规则的名称作为参数来执行 sp_helptext。 若要重命名规则,请使用 sp_rename

在创建同名的新规则之前,必须使用 DROP RULE 删除原有规则,而在此之前,必须先使用 sp_unbindrule 取消绑定。 若要取消规则与列的绑定,请使用 sp_unbindrule

可以在不取消绑定原有规则的情况下将新规则绑定到列或数据类型;新规则将覆盖原有规则。 绑定到列的规则始终优先于绑定到别名数据类型的规则。 将规则绑定到列时,将替换已经绑定到该列的别名数据类型的规则。 但是,将规则绑定到数据类型时,不会替换绑定到该别名数据类型的列的规则。 下表显示了当规则绑定到列以及绑定到已存在规则的别名数据类型时有效的优先级。

新规则绑定到 旧规则绑定到

别名数据类型
旧规则绑定到

别名数据类型 旧规则被替换 没有变化
旧规则被替换 旧规则被替换

如果列同时有与之相关联的默认值和规则,则默认值必须在规则定义的范围内。 与规则冲突的默认值永远不能被插入。 每次试图插入这样的默认值时,SQL Server 数据库引擎都会生成错误消息。

权限

若要执行 CREATE RULE,用户必须至少在当前数据库中具有 CREATE RULE 权限,并且对要在其中创建规则的架构具有 ALTER 权限。

示例

A. 创建具有范围的规则

以下示例创建一个规则,用以限制插入该规则被绑定到的列中的整数的范围。

CREATE RULE range_rule  
AS   
@range>= $1000 AND @range <$20000;  

B. 创建具有列表的规则

以下示例创建一个规则,用于将输入到该规则被绑定到的列中的实际值限制为只能是该规则中列出的值。

CREATE RULE list_rule  
AS   
@list IN ('1389', '0736', '0877');  

C. 创建具有模式的规则

以下示例创建一个遵循这种模式的规则:任意两个字符的后面跟一个连字符 (-) 和任意多个字符(或没有字符),并以 09 之间的整数结尾。

CREATE RULE pattern_rule   
AS  
@value LIKE '__-%[0-9]'  

另请参阅

ALTER TABLE (Transact-SQL)
CREATE DEFAULT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DROP DEFAULT (Transact-SQL)
DROP RULE (Transact-SQL)
表达式(Transact-SQL)
sp_bindrule (Transact-SQL)
sp_help (Transact-SQL)
sp_helptext (Transact-SQL)
sp_rename (Transact-SQL)
sp_unbindrule (Transact-SQL)
WHERE (Transact-SQL)