sp_bindrule (Transact-SQL)

将规则绑定到列或别名数据类型。

重要说明重要提示

后续版本的 Microsoft SQL Server 将删除该功能。 请不要在新的开发工作中使用该功能,并尽快修改当前还在使用该功能的应用程序。 改用 CHECK 约束。CHECK 约束可通过 CREATE TABLEALTER TABLE 语句的 CHECK 关键字创建。

主题链接图标Transact-SQL 语法约定

语法

sp_bindrule [ @rulename = ] 'rule' , 
     [ @objname = ] 'object_name' 
     [ , [ @futureonly = ] 'futureonly_flag' ] 

参数

  • [ @rulename=] 'rule'
    由 CREATE RULE 语句创建的规则名称。rule 的数据类型为 nvarchar(776),无默认值。

  • [ @objname= ] 'object_name'
    要绑定规则的表和列或别名数据类型。不能将规则绑定到 text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)、xml、CLR 用户定义类型或 timestamp 列。无法将规则绑定到计算列。

    object_name 的数据类型为 nvarchar(776),无默认值。如果 object_name 是由单个部分组成的名称,则按别名数据类型进行解析。如果是由两部分或三部分组成的名称,则首先按表和列进行解析;如果解析失败,则按别名数据类型进行解析。默认情况下,除非规则已经直接绑定到列,否则别名数据类型的现有列将继承 rule。

    注意注意

    object_name 中可以含有括号 [] 字符作为分隔标识符。有关详细信息,请参阅分隔标识符(数据库引擎)

    注意注意

    可以将针对使用别名数据类型的表达式创建的规则绑定到列或别名数据类型,但在引用这些规则时无法编译它们。避免使用对别名数据类型创建的规则。

  • [ @futureonly= ] 'futureonly_flag'
    仅当将规则绑定到别名数据类型时才能使用。future_only_flag 的数据类型为 varchar(15),默认值为 NULL。当此参数设置为 futureonly 时,可以防止具有别名类型的现有列继承新的规则。如果 futureonly_flag 为 NULL,则会将新规则绑定到目前没有规则或正在使用别名数据类型的现有规则的所有别名数据类型列上。

返回代码值

0(成功)或 1(失败)

注释

可以使用 sp_bindrule 在不取消绑定现有规则的情况下,将新规则绑定到列(尽管最好使用 CHECK 约束)或者别名数据类型。覆盖原有规则。如果使用现有 CHECK 约束将规则绑定到列,那么将评估所有限制。不能将规则绑定到 SQL Server 数据类型。

当尝试执行 INSERT 语句时(而非绑定时),将强行执行规则。尽管此处 INSERT 操作无效,仍然可以将字符规则绑定到数据类型为 numeric 的列。

除非将 futureonly_flag 指定为 futureonly,否则别名数据类型的现有列将继承新规则。使用别名数据类型定义的新列始终继承规则。但是,如果 ALTER TABLE 语句的 ALTER COLUMN 子句将列的数据类型更改为绑定规则的别名数据类型,那么列不会继承与数据类型绑定的规则。必须使用 sp_bindrule 专门将规则绑定到列。

将规则绑定到列时,相关信息将添加到 sys.columns 表中。将规则绑定到别名数据类型时,相关信息将添加到 sys.types 表中。

权限

若要将规则绑定到表列,您必须具有表的 ALTER 权限。若要将规则绑定到别名数据类型,您需要具有别名数据类型的 CONTROL 权限或该类型所属架构的 ALTER 权限。

示例

A. 将规则绑定到列

假设已经用 CREATE RULE 语句在当前数据库中创建了名为 today 的规则,以下示例将规则绑定到 Employee 表的 HireDate 列。将行添加到 Employee 时,按照 today 规则检查 HireDate 列的数据。

USE master;
GO
EXEC sp_bindrule 'today', 'HumanResources.Employee.HireDate'

B. 将规则绑定到别名数据类型

假设存在名为 rule_ssn 的规则和名为 ssn 的别名数据类型,以下示例将 rule_ssn 绑定到 ssn。在 CREATE TABLE 语句中,类型为 ssn 的列会继承 rule_ssn 规则。类型为 ssn 的现有列也会继承 rule_ssn 规则,除非为 futureonly_flag 指定了 futureonly,或者在 ssn 上直接绑定了规则。绑定到列的规则始终优先于绑定到数据类型的规则。

USE master;
GO
EXEC sp_bindrule 'rule_ssn', 'ssn'

C. 使用 futureonly_flag

以下示例将 rule_ssn 规则绑定到别名数据类型 ssn。由于已指定 futureonly,因此不影响类型为 ssn 的现有列。

USE master;
GO
EXEC sp_bindrule rule_ssn, 'ssn', 'futureonly'

D. 使用分隔标识符

以下示例说明了分隔标识符在 object_name 参数中的用法。

USE master;
GO
CREATE TABLE [t.2] (c1 int) 
-- Notice the period as part of the table name.
EXEC 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.