适用于: SQL Server
Azure SQL 数据库
将规则绑定到列或别名数据类型。
重要
在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 请改用 唯一约束和检查约束 。 CHECK 约束是使用 CREATE TABLE 或 ALTER TABLE 语句的 CHECK 关键字创建的。
语法
sp_bindrule
[ @rulename = ] N'rulename'
, [ @objname = ] N'objname'
[ , [ @futureonly = ] 'futureonly' ]
[ ; ]
参数
[ @rulename = ] N'rulename'
语句创建 CREATE RULE 的规则的名称。 @rulename为 nvarchar(776),没有默认值。
[ @objname = ] N'objname'
要绑定到的表和列,或规则要绑定到的别名数据类型。 @objname为 nvarchar(776),没有默认值。
规则不能绑定到文本、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)、xml、CLR 用户定义类型或时间戳列。 规则不能绑定到计算列。
@objname为 nvarchar(776),没有默认值。 如果 @objname 是一个部分名称,它将解析为别名数据类型。 如果它是由两部分或三部分构成的名称,则首先解析为表和列;如果此解析失败,它将解析为别名数据类型。 默认情况下,别名数据类型的现有列继承 @rulename ,除非规则直接绑定到该列。
@objname可以包含带分隔符的方括号([和])字符。 有关详细信息,请参阅 数据库标识符。
针对使用别名数据类型的表达式创建的规则可以绑定到列或别名数据类型,但在引用列或别名数据类型时无法编译。 避免使用对别名数据类型创建的规则。
[ @futureonly = ] 'futureonly'
仅在将规则绑定到别名数据类型时使用。 @futureonly为 varchar(15),默认值为 NULL. 如果设置为 NULL,新规则将绑定到别名数据类型当前没有规则或正在使用别名数据类型的现有规则的任何列。
返回代码值
0(成功)或 1(失败)。
注解
可以将新规则绑定到列(尽管首选使用 CHECK 约束),也可以绑定到别名数据类型, sp_bindrule 而无需取消绑定现有规则。 覆盖原有规则。 如果规则绑定到具有现有 CHECK 约束的列,则会评估所有限制。 无法将规则绑定到 SQL Server 数据类型。
尝试语句而不是绑定时 INSERT ,将强制实施该规则。 可以将字符规则绑定到数值数据类型的列,尽管此类INSERT操作无效。
除非指定@futureonly,futureonly否则别名数据类型的现有列将继承新规则。 使用别名数据类型定义的新列始终继承规则。 但是,如果语句的ALTER TABLE子句将ALTER COLUMN列的数据类型更改为绑定到规则的别名数据类型,则绑定到数据类型的规则不会由该列继承。 该规则必须使用 专门绑定到列 sp_bindrule。
将规则绑定到列时,相关信息将添加到 sys.columns 表中。 将规则绑定到别名数据类型时,相关信息将添加到 sys.types 表中。
权限
若要将规则绑定到表列,您必须对表具有 ALTER 权限。 CONTROL 别名数据类型的权限或 ALTER 类型所属架构的权限是将规则绑定到别名数据类型所必需的。
示例
A. 将规则绑定到列
假设使用CREATE RULE语句在当前数据库中创建了一个命名today的规则,以下示例将规则HireDate绑定到表的Employee列。 将行添加到 Employee 时,按照 HireDate 规则检查 today 列的数据。
USE master;
GO
EXECUTE sp_bindrule 'today', 'HumanResources.Employee.HireDate';
B. 将规则绑定到别名数据类型
假设存在名为 rule_ssn 的规则和名为 ssn 的别名数据类型,以下示例将 rule_ssn 绑定到 ssn。 CREATE TABLE在语句中,类型的ssn列继承规则rule_ssn。 类型的现有列ssn也会继承规则rule_ssn,除非为@futureonly指定了 futureonly,或者ssn具有直接绑定到该规则的规则。 绑定到列的规则始终优先于绑定到数据类型的默认值。
USE master;
GO
EXECUTE sp_bindrule 'rule_ssn', 'ssn';
°C 使用 futureonly 选项
以下示例将 rule_ssn 规则绑定到别名数据类型 ssn。 由于已指定 futureonly,因此不影响类型为 ssn 的现有列。
USE master;
GO
EXECUTE sp_bindrule rule_ssn, 'ssn', 'futureonly';
D. 使用带分隔符的标识符
以下示例演示如何在 @objname 参数中使用带分隔符的标识符。
USE master;
GO
CREATE TABLE [t.2] (c1 INT);
-- Notice the period as part of the table name.
EXECUTE sp_bindrule rule1, '[t.2].c1';
-- The object contains two periods;
-- the first is part of the table name
-- and the second distinguishes the table name from the column name.