将规则/默认值绑定到用户定义数据类型
使用此对话框查看或指定下列选项。
选项
规则
查看希望绑定到用户定义的数据类型的规则名。当绑定到列或用户定义数据类型时,规则将指定可以插入到列中的可接受的值。规则是一种向后兼容的功能,执行一些与检查约束相同的功能。check 约束是使用 alter 或 create table 的 check 关键字创建的,是对列中的值进行限制的首选标准方法(可以对一列或多列定义多个约束)。列或用户定义数据类型只能有一个绑定的规则。但是,列可以同时具有规则和一个或多个与其关联的检查约束。在这种情况下,将检查所有限制。有关规则的更多信息,请参见 create rule。
规则
规则是一个向后兼容的功能,用于执行一些与 check 约束相同的功能。check 约束是用来限制列值的首选标准方法。check 约束比规则更简明,一个列只能应用一个规则,但是却可以应用多个 check 约束。check 约束作为 create table 语句的一部分进行指定,而规则以单独的对象创建,然后绑定到列上。
下例创建一个规则,执行与前面主题中的 check 约束示例相同的功能。microsoft® sql server™ 2000 首选的方法是 check 约束。
create rule id_chk as @id between 0 and 10000
go
create table cust_sample
(
cust_id int
primary key,
cust_name char(50),
cust_address char(50),
cust_credit_limit money,
)
go
sp_bindrule id_chk, cust_sample.cust_id
go
名称
查看用户定义的数据类型的名称和数据类型。通过选中”绑定”框选择要绑定的每个规则。选择”仅将来”框会防止现有用户定义数据类型列继承新规则。如果选定”仅将来”框,新规则将绑定到当前没有规则或使用现有用户定义数据类型规则的任何用户定义数据类型列。有关绑定规则的更多信息,请参见 sp_bindrule。
一、create rule
创建称为规则的对象。当绑定到列或用户定义数据类型时,规则将指定可以插入到列中的可接受的值。规则是一种向后兼容的功能,执行一些与检查约束相同的功能。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 将空字符串解释为空字符串。有关更多信息,请参见 sp_dbcmptlevel。
权限
create rule 权限默认授予 sysadmin 固定服务器角色成员和 db_ddladmin 和 db_owner 固定数据库角色成员。sysadmin、db_owner 和 db_securityadmin 角色的成员可以将权限转让给其他用户。
示例
a. 范围规则
下例创建一个规则,用以限制插入该规则所绑定的列中的整数范围。
create rule range_rule
as
@range >= $1000 and @range < $20000
b. 列表规则
下例创建一个规则,用以将输入到该规则所绑定的列中的实际值限制为只能是该规则中列出的值。
create rule list_rule
as
@list in (1389, 0736, 0877)
c. 模式规则
下例创建一个遵循这种模式的规则:任意两个字符的后面跟一个连字符和任意多个字符(或没有字符),并以 0 到 9 之间的整数结尾。
create rule pattern_rule
as
@value like _ _-%[0-9]
二、drop rule从当前数据库中删除一个或多个用户定义的规则。语法drop rule { rule } [ ,…n ]参数rule是要删除的规则。规则名称必须符合标识符规则。有关标识符规则的更多信息,请参见使用标识符。可以选择是否指定规则所有者的名称。n是表示可以指定多个规则的占位符。注释如果规则当前绑定到列或用户定义的数据类型,若要除去规则,首先需解除绑定。使用 sp_unbindrule 解除绑定规则。如果在试图除去规则时规则是绑定的,将显示错误信息并取消 drop rule 语句。除去规则后,可以在以前受规则约束的列中输入新数据而不受规则的约束。现有数据不受任何影响。 drop rule 语句不适用于 check 约束。有关除去 check 约束的更多信息,请参见本卷中的”alter table”。权限默认情况下,将 drop rule 权限授予规则所有者,该权限不可转让。然而,db_owner 和 db_ddladmin 固定数据库角色成员和 sysadmin 固定服务器角色成员可以通过在 drop rule 内指定所有者除去任何对象。示例下例解除绑定名为 pub_id_rule 的规则并将其除去。use pubs
if exists (select name from sysobjects
where name = pub_id_rule
and type = r)
begin
exec sp_unbindrule publishers.pub_id
drop rule pub_id_rule
end
go
三、create default创建称为默认值的对象。当绑定到列或用户定义数据类型时,如果插入时没有明确提供值,默认值便指定一个值,并将其插入到对象所绑定的列中(或者,在用户定义数据类型的情况下,插入到所有列中)。默认值是一个向后兼容的功能,它执行一些与使用 alter 或 create table 语句的 default 关键字创建的默认值定义相同的功能。默认值定义是限制列数据的首选并且标准的方法,因为定义和表存储在一起,当除去表时,将自动除去默认值定义。然而,当在多个列中多次使用默认值时,默认值也有其优点。语法create default default as constant_expression参数default默认值的名称。默认值名称必须符合标识符的规则。可以选择是否指定默认值所有者名称。constant_expression只包含常量值的表达式(不能包含任何列或其它数据库对象的名称)。可以使用任何常量、内置函数或数学表达式。字符和日期常量用单引号 () 引起来;货币、整数和浮点常量不需要使用引号。二进制数据必须以 0x 开头,货币数据必须以美元符号 ($) 开头。默认值必须与列数据类型兼容。注释只能在当前数据库中创建默认值的名称。在数据库中,每个所有者的各默认值名称必须是唯一的。创建默认值后,使用 sp_bindefault 将其绑定到列或用户定义数据类型。如果默认值和其绑定到的列不兼容,则在尝试插入默认值时,microsoft® sql server™ 会生成错误信息。例如,n/a 不能用作 numeric 列的默认值。如果默认值对于它所绑定的列而言太长,该值就会被截断。在单个批处理中,create default 语句不能与其它 transact-sql 语句组合使用。在以相同的名称创建新的默认值之前,必须除去原有的默认值,在除去前,必须通过执行 sp_unbindefault 来取消对该默认值的绑定。如果列同时有默认值和规则与之关联,则默认值不能违反规则。与规则冲突的默认值将永远不能插入列,每次试图插入这样的默认值时,sql server 都会生成错误信息。当绑定到列以后,在以下情况下将插入默认值: 非显式地插入值。在 insert 中使用 default values 或 default 关键字来插入默认值。 如果在创建列时指定 not null 并且没有为其创建默认值,则当用户未能为该列输入项时,就会生成错误信息。下表说明默认值的存在性与将列定义为 null 或 not null 之间的关系。表中的条目显示了结果。列定义 没有输入项,没有默认值 没有输入项,有默认值 输入 null,没有默认值 输入 null,有默认值 null null default null null not null error default error error 说明 sql server 是将空字符串解释为单个空格还是解释为真正的空字符串,由 sp_dbcmptlevel 的设置控制。如果兼容级别小于或等于 65,sql server 就将空字符串解释为单个空格。如果兼容级别等于 70,则 sql server 将空字符串解释为空字符串。有关更多信息,请参见 sp_dbcmptlevel。若要重命名默认值,请使用 sp_rename。若要获得默认值的报表,请使用 sp_help。权限create default 的权限默认授予 sysadmin 固定服务器角色成员和 db_owner 和 db_ddladmin 固定数据库角色成员。sysadmin、db_owner 和 db_securityadmin 角色的成员可以将权限转让给其他用户。示例a.创建简单的字符默认值下面的示例创建字符默认值 unknown。use pubs
go
create default phonedflt as unknown
b.绑定默认值下面的示例绑定示例 a 中创建的默认值。只有当 authors 表的 phone 列没有输入项时,该默认值才起作用。请注意,没有输入项和显式指定空值不同。因为名为 phonedflt 的默认值不存在,所以下列 transact-sql 语句将失败。本例只用于演示。use pubs
go
sp_bindefault phonedflt, authors.phone
四、drop default从当前数据库中删除一个或多个用户定义的默认值。 drop default 语句不适用于 default 约束。有关除去 default 约束(通过使用 create table 或 alter table 语句的 default 选项所创建)的更多信息,请参见本卷中的”alter table”。语法drop default { default } [ ,…n ]参数default是现有默认值的名称。若要查看现有默认值的列表,请执行 sp_help。默认值必须符合标识符规则。有关更多信息,请参见使用标识符。可以选择是否指定默认值所有者名称。n是表示可以指定多个默认值的占位符。注释除去默认之前,通过执行 sp_unbindefault 解除绑定默认值(如果默认值当前绑定到列或用户定义的数据类型)。从允许空值的列中除去默认值后,当添加行且没有显式提供值时,将在那个位置插入 null。从 not null 列中除去默认值后,当添加行且没有显式提供值时,将返回错误信息。这些行以后作为标准 insert 语句行为的一部分添加。权限默认情况下,将 drop default 权限授予默认值所有者,该权限不可转让。然而,db_owner 和 db_ddladmin 固定数据库角色成员以及 sysadmin 固定服务器角色成员可以通过在 drop default 中指定所有者除去任何默认对象。示例a. 除去默认值如果默认值没有绑定到列或用户定义的数据类型,可以很容易地使用 drop default 将其除去。下例删除用户创建的名为 datedflt 的默认值。use pubs
if exists (select name from sysobjects
where name = datedflt
and type = d)
drop default datedflt
go
b. 除去绑定到列的默认值下例解除绑定与 authors 表的 phone 列关联的默认值,然后除去名为 phonedflt 的默认值。use pubs
if exists (select name from sysobjects
where name = phonedflt
and type = d)
begin
exec sp_unbindefault authors.phone
drop default phonedflt
end
gosp_bindrule将规则绑定到列或用户定义的数据类型。语法sp_bindrule [ @rulename = ] rule , [ @objname = ] object_name [ , [ @futureonly = ] futureonly_flag ]参数[@rulename =] rule由 create rule 语句创建的规则名称。rule 的数据类型为 nvarchar(776),无默认值。[@objname =] object_name绑定了规则的表和列或用户定义的数据类型。object_name 的数据类型为 nvarchar(517),无默认值。如果 object_name 没有采取 table.column 格式,则认为它属于用户定义数据类型。默认情况下,用户定义的数据类型的现有列继承 rule,除非直接在列上绑定了规则。 说明 object_name 中可以含有 [ and ] 字符作为分隔标识符。有关更多信息,请参见分隔标识符。 [@futureonly =] futureonly_flag仅当将规则绑定到用户定义的数据类型时才使用。future_only_flag 的数据类型为 varchar(15),默认值为 null。将此参数在设置为 futureonly 时,它会防止用户定义数据类型的现有列继承新规则。如果 futureonly_flag 为 null,那么新规则将绑定到用户定义数据类型的每一列,条件是此数据类型当前无规则或者使用用户定义数据类型的现有规则。 返回代码值0(成功)或 1(失败)注释可以使用 sp_bindrule 在不取消绑定现有规则的情况下,将新规则绑定到列(尽管最好使用 check 约束)或者用户定义的数据类型。替代原有规则。如果使用现有 check 约束将规则绑定到列,那么将评估所有限制。不能将规则绑定到 microsoft® sql server™ 数据类型。当试图执行 insert 语句时(不是在绑定时),将强行执行规则。尽管此处 insert 非法,仍然可以将字符规则绑定到 numeric 数据类型的列。除非将 futureonly_flag 指定为 futureonly,否则用户定义数据类型的现有列将继承新规则。使用用户定义数据类型定义的新列始终继承规则。但是,如果 alter table 语句的 alter column 子句将列的数据类型更改为绑定规则的用户定义数据类型,那么列不会继承与数据类型绑定的规则。必须使用 sp_bindrule 专门将规则绑定到列。将规则绑定到列时,相关信息将添加到 syscolumns 表中。将规则绑定到用户定义的数据类型时,相关信息将添加到 systypes 表中。权限只有 sysadmin 固定服务器角色、db_owner 和 db_ddladmin 固定数据库角色成员及表所有者才能执行 sp_bindrule。示例a. 将规则绑定到列假设已经用 create rule 语句在当前数据库中创建名为 today 的规则,此示例将规则绑定到 employees 表的 hire date 列。将行添加到 employees 时,按照 today 规则检查 hire date 列的数据。use master
exec sp_bindrule today, employees.[hire date]
b. 将规则绑定到用户定义的数据类型假设存在名为 rule_ssn 的规则和名为 ssn 的用户定义数据类型,此示例将 rule_ssn 绑定到 ssn。在 create table 语句中,类型 ssn 的列继承 rule_ssn 规则。类型 ssn 的现有列也继承 rule_ssn 规则,除非为 futureonly_flag 指定了 futureonly 或者在 ssn 上直接绑定了规则。绑定到列的规则始终优先于绑定到数据类型的规则。use master
exec sp_bindrule rule_ssn, ssn
c. 使用 futureonly_flag此示例将 rule_ssn 规则绑定到用户定义数据类型 ssn。因为已指定 futureonly,所以不影响类型 ssn 的现有列。use master
exec sp_bindrule rule_ssn, ssn, futureonly
d. 使用分隔标识符此示例显示了在 object_name 中分隔标识符的使用。use master
create table [t.2] (c1 int)
— notice the period as part of the table name.
exec sp_binderule 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.
六、sp_unbindrule
在当前数据库中为列或用户定义数据类型解除规则绑定。
语法
sp_unbindrule [@objname =] object_name
[, [@futureonly =] futureonly_flag]
参数
[@objname =] object_name
是要解除规则绑定的表和列或者用户定义数据类型的名称。object_name 的数据类型为 nvarchar(776),无默认值。如果参数不是 table.column 的形式,则假定 object_name 为用户定义数据类型。当为用户定义数据类型解除规则绑定时,所有属于该数据类型并具有相同规则的列也同时解除规则绑定。对属于该数据类型的列,如果其规则直接绑定到列上,则该列不受影响。
说明 object_name 中可以含有 [ and ] 字符作为分隔标识符。有关更多信息,请参见分隔标识符。
[@futureonly =] futureonly_flag
仅用于解除用户定义数据类型规则的绑定。futureonly_flag 的数据类型为 varchar(15),其默认值为 null。当参数 futureonly_flag 为 futureonly 时,现有的属于该数据类型的列不会失去指定规则。
返回代码值
0(成功)或 1(失败)
注释
若要显示某条规则的文本,请以该规则的名称作为参数来执行存储过程 sp_helptext。
解除规则绑定时,如果规则绑定到列,则绑定信息从表 syscolumns 中删除。如果规则绑定到用户定义数据类型,则绑定信息从表 systypes 中删除。
当从用户定义数据类型解除规则绑定时,任何具有该用户定义数据类型的列也同时解除该规则的绑定。对于后来用 alter table 语句的 alter column 子句更改了数据类型的列,该规则仍可能绑定在该列上,必须使用存储过程 sp_unbindrule(并指定列名)明确地从这些列中解除规则绑定。
权限
只有 sysadmin 固定服务器角色、db_owner 和 db_ddladmin 固定数据库角色的成员以及表所有者才能执行 sp_unbindrule。
示例
a. 为列解除规则绑定
下例为表 employees 的 startdate 列解除规则绑定。
exec sp_unbindrule employees.startdate
b. 为用户定义数据类型解除规则绑定
下例为用户定义数据类型 ssn 解除规则绑定。这将为该数据类型的现有列和将来的列解除规则绑定。
exec sp_unbindrule ssn
c. 使用 futureonly_flag
下例为用户定义数据类型 ssn 的解除规则绑定,现有的 ssn 列不受影响。
exec sp_unbindrule ssn, futureonly
d. 使用分隔标识符
下例显示了在 object_name 中定界标识符的使用。
create table [t.4] (c1 int) — notice the period as part of the table
— name.
go
create rule rule2 as @value > 100
go
exec sp_bindrule rule2, [t.4].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.
go
exec sp_unbindrule [t.4].c1
七、sp_addtype
创建用户定义的数据类型。
语法
sp_addtype [ @typename = ] type,
[ @phystype = ] system_data_type
[ , [ @nulltype = ] null_type ]
[ , [ @owner = ] owner_name ]
参数
[@typename =] type
用户定义的数据类型的名称。数据类型名称必须遵照标识符的规则,而且在每个数据库中必须是唯一的。type 的数据类型为 sysname,没有默认值。
[@phystype =] system_data_type
是用户定义的数据类型所基于的物理数据类型或 microsoft® sql server™ 提供的数据类型(decimal、int 等等)。system_data_type 的数据类型是 sysname,没有默认值,可能是这些值之一:
binary( n ) image smalldatetime
bit int smallint
char( n ) nchar( n ) text
datetime ntext tinyint
decimal numeric uniqueidentifier
decimal[ ( p [, s ] ) ] numeric[ ( p [ , s ] ) ] varbinary( n )
float nvarchar( n ) varchar( n )
float( n ) real
如果参数中嵌入有空格或标点符号,则必须用引号将该参数引起来。有关可用的数据类型的更多信息,请参见数据类型。
n
非负整数,指明所选数据类型的长度。
p
非负整数,指明可保留的最大十进制位数,包括小数点左边和右边的数字。有关更多信息,请参见 decimal 和 numeric。
s
非负整数,指明小数点右边的小数数字可保留的最大十进制位数,它必须小于或等于精度值。有关更多信息,请参见本卷中的”decimal 和 numeric”。
[@nulltype =] null_type
指明用户定义的数据类型处理空值的方式。null_type 的数据类型为 varchar(8),默认值为 null,并且必须用单引号引起来(null、not null 或 nonull)。如果没有用 sp_addtype 显式定义 null_type,则将其设置为当前默认的为空性。使用 getansinull 系统函数可确定当前默认的为空性,可以使用 set 语句或 sp_dboption 对该为空性进行调整。应显式定义为空性。
说明 null_type 参数只为该数据类型定义默认的为空性。如果在创建表的过程中使用用户定义的数据类型时显式地定义了为空性,那么该为空性优先于已定义好的为空性。有关更多信息,请参见 alter table 和 create table。
[@owner =] owner_name
指定新数据类型的创建者或所有者。owner_name 的数据类型为 sysname。当没有指定时,owner_name 为当前用户。
返回代码值
0(成功)或 1(失败)
结果集
无
注释
用户定义的数据类型名称在数据库中必须是唯一的,但是名称不同的用户定义的数据类型可以有相同的定义。
除非将 master 作为当前数据库来执行 sp_addtype,否则,执行 sp_addtype 会创建用户定义的数据类型,并且将其添加到某个特定数据库的 systypes 系统表中。如果想在所有新的用户定义的数据库中都可以使用这一用户定义的数据类型,请将其添加到 model。在创建了用户数据类型之后,可以在 create table 或 alter table 中使用它,也可以将默认值和规则绑定到用户定义的数据类型。
不能使用 sql server timestamp 数据类型来定义用户定义的数据类型。
权限
执行权限默认授予 public 角色。
示例
a. 创建不允许空值的用户定义数据类型
下面的示例创建一个名为 ssn(社会保险号)的用户定义数据类型,它基于 sql server 提供的 varchar 数据类型。ssn 数据类型用于那些保存 11 位数字的社会保险号 (999-99-9999) 的列。该列不能为 null。
请注意,varchar(11) 由单引号引了起来,这是因为它包含了标点符号(圆括号)。
use master
exec sp_addtype ssn, varchar(11), not null
b. 创建允许空值的用户定义数据类型
下面的示例创建了一个名为 birthday 的用户定义数据类型(基于 datetime),该数据类型允许空值。
use master
exec sp_addtype birthday, datetime, null
c. 创建另外的用户定义的数据类型
下面的示例为国内及国际电话和传真号码另外创建两个用户定义的数据类型 telephone 和 fax。
use master
exec sp_addtype telephone, varchar(24), not null
exec sp_addtype fax, varchar(24), null
八、sp_droptype
从 systypes 删除用户定义的数据类型。
语法
sp_droptype [ @typename = ] type
参数
[@typename =] type
您所拥有的用户定义数据类型的名称。type 的数据类型为 sysname,没有默认值。
返回代码类型
0(成功)或 1(失败)
结果集
无
注释
如果表或其它数据库对象引用 type 用户定义数据类型,那么就不能除去这种数据类型。
说明 如果在表定义内使用某个用户定义的数据类型,或者将某个规则或默认值绑定到这种数据类型,那么就不能除去它。
权限
执行权限默认授予 sysadmin 固定服务器角色、db_ddladmin 和 db_owner 固定数据库角色成员以及数据类型所有者。
示例
下面的示例除去用户定义的数据类型 birthday。
说明 该用户定义的数据类型必须已经存在,否则下面的示例会返回一条错误信息。
use master
exec sp_droptype birthday