1、默认和规则默认和规则Default and Rule 默默 认认 Default 默认也是一种数据库对象,它可以实现一种与默认值约默认也是一种数据库对象,它可以实现一种与默认值约束功能相似的数据完整性检测功能。束功能相似的数据完整性检测功能。当程序使用当程序使用INSERT语句插入数据时,它可以为数据库语句插入数据时,它可以为数据库中的数据表中的数据表提供默认数据提供默认数据。对于一个具体的数据表来说,默认对象所执行的功能与对于一个具体的数据表来说,默认对象所执行的功能与默认值约束完全一样。但默认值约束是与一个数据表相默认值约束完全一样。但默认值约束是与一个数据表相联系的,其作用范围仅限于所在
2、的数据表。而默认对象联系的,其作用范围仅限于所在的数据表。而默认对象则是则是独立于数据表而创建的独立于数据表而创建的,只有将其应用于一个数据,只有将其应用于一个数据表时,才对所应用的数据起作用。表时,才对所应用的数据起作用。默默 认认 Default 默认值约束是在使用默认值约束是在使用 CREATE TABLE 或或 ALTER TABLE 语句定义数据表时定义,它与表定义存储在一语句定义数据表时定义,它与表定义存储在一起。所以在删除数据表时,默认值约束也被自动删除。起。所以在删除数据表时,默认值约束也被自动删除。而默认对象则需要使用而默认对象则需要使用 DEFAULT 语句定义,它作为一语
3、句定义,它作为一种数据库对象而独立存在。默认对象可以被多次应用不种数据库对象而独立存在。默认对象可以被多次应用不同的数据表,不同的列或用户定义数据类型。即使被其同的数据表,不同的列或用户定义数据类型。即使被其作用的数据被删除,也不能删除默认对象,而需要使用作用的数据被删除,也不能删除默认对象,而需要使用专门的语句来删除。专门的语句来删除。使用企业管理器创建默认对象使用企业管理器创建默认对象 展开需要创建默认对象的数据库;展开需要创建默认对象的数据库;右键单击右键单击“DEFAULT”;选择选择“New Default”菜单;菜单;在在“Default Properties”对话框的对话框的“N
4、ame”中输入默中输入默认对象的名称,在认对象的名称,在“Value”中输入默认值;中输入默认值;单击单击“确定确定”。使用使用T-SQL语句创建默认对象语句创建默认对象 格式为:格式为:CREATE DEFAULT 默认值名默认值名 AS 常数表达式常数表达式 默认值名称必须符合标识符的规则。默认值名称必须符合标识符的规则。常数表达式是指常数表达式是指只包含常量值的表达式只包含常量值的表达式(不能包含任何(不能包含任何列或其他数据库对象的名称)。可以使用任何常量、内列或其他数据库对象的名称)。可以使用任何常量、内置函数或数学表达式。字符和日期常量用单引号(置函数或数学表达式。字符和日期常量用
5、单引号()引起来;货币、整数和浮点常量不需要使用引号。二进引起来;货币、整数和浮点常量不需要使用引号。二进制数据必须以制数据必须以 0 x 开头,货币数据必须以美元符号(开头,货币数据必须以美元符号($)开头。默认值必须与列数据类型兼容。开头。默认值必须与列数据类型兼容。【例例】创建字符默认值】创建字符默认值 男男。use student go create default ssex as 男男 go CREATE DEFAULT 语句只能在当前数据库中创建语句只能在当前数据库中创建默认。对每个用户来说,在同一个数据库中创建的默认。对每个用户来说,在同一个数据库中创建的默认值的名称必须保持惟一
6、。默认值的名称必须保持惟一。应用默认对象(企业管理器)应用默认对象(企业管理器)展开需要创建默认对象的数据库;展开需要创建默认对象的数据库;在对象上右键单击在对象上右键单击“属性属性”;单击单击“Default Properties”对话框的对话框的“Bind Columns”按钮;按钮;单击单击“Bind Default to Columns”对话框的对话框的“Table”下拉按下拉按钮,选择数据表;钮,选择数据表;在在“Unbound columns”栏中选择需要绑定的列;栏中选择需要绑定的列;单击单击“Add”按钮;按钮;单击单击“确定确定”。应用默认对象(应用默认对象(T-SQL语句)
7、语句)使用使用sp_bindefault将默认值绑定到列或用户定义的数将默认值绑定到列或用户定义的数据类型。据类型。语法格式为:语法格式为:sp_bindefault defname=默认值名默认值名,objname=对象名对象名 ,futureonly=futureonly_flag 参数参数defname=default是由是由CREATE DEFAULT 语句创建的默认名称。语句创建的默认名称。应用默认对象(应用默认对象(T-SQL语句)语句)对象名是指要绑定默认值的对象名是指要绑定默认值的表和列名称表和列名称或或用户定义的数用户定义的数据类型据类型。如果对象名没有采取如果对象名没有采取
8、table.column形式,则认为它属于形式,则认为它属于用户定义数据类型。用户定义数据类型。默认情况下,默认情况下,用户定义数据类型的现有列继承用户定义数据类型的现有列继承default,除非默认值直接绑定到列中除非默认值直接绑定到列中。默认值无法绑定到默认值无法绑定到timestamp数据类型的列、带数据类型的列、带IDENTITY属性的列或者已经有属性的列或者已经有DEFAULT约束的列。约束的列。应用默认对象(应用默认对象(T-SQL语句)语句)futureonly_flag仅在将默认值绑定到用户定义的数据仅在将默认值绑定到用户定义的数据类型时才使用。类型时才使用。其值为其值为NUL
9、L时,说明将表中该用户定义数据类型列时,说明将表中该用户定义数据类型列的默认值设置为当前默认对象之值。的默认值设置为当前默认对象之值。其值为其值为futureonly时,说明当前所应用的默认对象不时,说明当前所应用的默认对象不影响表中已存在的用户定义数据类型列的默认值,而影响表中已存在的用户定义数据类型列的默认值,而只对以后插入行产生影响。只对以后插入行产生影响。【例例】将默认值绑定到列。】将默认值绑定到列。假定已经用假定已经用CREATE DEFAULT语句在当前数据库语句在当前数据库中定义了名为中定义了名为Chengji的默认值,此示例将默认值绑的默认值,此示例将默认值绑定到定到 SC表的
10、表的Grade列。当将行添加到列。当将行添加到SC 表而且没表而且没有提供有提供Grade列的数据时,列取得默认值列的数据时,列取得默认值 Chengji的的值。值。exec sp_bindefault Chengji,SC.Grade go【例例】将默认值绑定到用户定义的】将默认值绑定到用户定义的数据类型。数据类型。假定存在名为假定存在名为def_ssn的默认值和名为的默认值和名为ssn的用户定义数据类的用户定义数据类型,此例将默认值型,此例将默认值def_ssn绑定到用户定义的数据类型绑定到用户定义的数据类型 ssn中。中。在创建表时,所有指派了用户定义数据类型在创建表时,所有指派了用户定
11、义数据类型ssn的列都将继承的列都将继承默认值。类型默认值。类型ssn的现有列也继承默认值的现有列也继承默认值 def_ssn,除非为,除非为futureonly_flag值指定了值指定了futureonly,或者在列上直接绑定了,或者在列上直接绑定了默认值。绑定到列的默认值始终默认值。绑定到列的默认值始终优先于优先于绑定到数据类型的默绑定到数据类型的默认值。认值。exec sp_bindefault def_ssn,ssn go【例例】使用】使用 futureonly_flag。此示例将默认值此示例将默认值def_ssn绑定到用户定义的数据类绑定到用户定义的数据类型型 ssn。因为已指定。因
12、为已指定futureonly,所以不影响类型,所以不影响类型ssn 的现有列。的现有列。exec sp_bindefault def_ssn,ssn,futureonly go 解除绑定(企业管理器)解除绑定(企业管理器)如果不再需要默认值的应用,则可以使用系统存储过程如果不再需要默认值的应用,则可以使用系统存储过程sp_unbindefault解除默认值与列和用户定义数据类型之解除默认值与列和用户定义数据类型之间的关联。间的关联。如果要删除某个默认值,则首先要解除此默认值的一切如果要删除某个默认值,则首先要解除此默认值的一切绑定。绑定。无论是列还是用户定义数据类型,只能同时关联一个默无论是列
13、还是用户定义数据类型,只能同时关联一个默认值,当关联新的默认值时,旧的关联自动删除。认值,当关联新的默认值时,旧的关联自动删除。解除绑定(企业管理器)解除绑定(企业管理器)展开需要删除默认对象的数据库;展开需要删除默认对象的数据库;在对象上右键单击在对象上右键单击“属性属性”;单击单击“Default Properties”对话框的对话框的“Bind Columns”按钮;按钮;单击单击“Bind Default to Columns”对话框的对话框的“Table”下拉按下拉按钮,选择数据表;钮,选择数据表;在在“Unbound columns”栏中选择需要解除绑定的列;栏中选择需要解除绑定的
14、列;单击单击“Remove”按钮;按钮;单击单击“确定确定”。解除绑定(解除绑定(T-SQL语句)语句)使用使用sp_unbindefault在当前数据库中为列或用户定义数在当前数据库中为列或用户定义数据类型解除默认值绑定。据类型解除默认值绑定。语法格式为:语法格式为:sp_unbindefault objname=对象名对象名 ,futureonly=futureonly_flag 对象名是要解除默认值绑定的表和列或者用户定义数据对象名是要解除默认值绑定的表和列或者用户定义数据类型的名称。类型的名称。futureonly=futureonly_flag仅用于解除用户定义数仅用于解除用户定义数
15、据类型默认值的绑定。据类型默认值的绑定。设置为设置为futureonly时,现有的属时,现有的属于该数据类型的列不会失去指定的默认值。于该数据类型的列不会失去指定的默认值。【例例】为列解除默认值绑定。】为列解除默认值绑定。为表为表 employees 的的 hiredate 列解除默认值绑定。列解除默认值绑定。exec sp_unbindefault employees.hiredate【例】为用户定义数据类型解除默认值绑定。【例】为用户定义数据类型解除默认值绑定。为用户定义数据类型为用户定义数据类型 ssn 解除默认值绑定。这将为该数解除默认值绑定。这将为该数据类型的现有列和将来的列解除绑定
16、。据类型的现有列和将来的列解除绑定。exec sp_unbindefault ssn【例】使用【例】使用 futureonly_flag。为用户定义数据类型为用户定义数据类型 ssn 解除默认值绑定,现有的解除默认值绑定,现有的 ssn 列不受影响。列不受影响。exec sp_unbindefault ssn,futureonly 删除默认值(企业管理器)删除默认值(企业管理器)右键单击默认对象;右键单击默认对象;单击单击“删除删除”按钮;按钮;单击单击“Drop Object”对话框的对话框的“Drop All”按钮。按钮。删除默认值删除默认值 使用使用DROP DEFAULT从当前数据库中
17、删除一个从当前数据库中删除一个或多个用户定义的默认值。或多个用户定义的默认值。语法格式为:语法格式为:DROP DEFAULT 默认值名默认值名 ,.n 【例例】除去默认值。】除去默认值。如果默认值没有绑定到列或用户定义的数据类型,如果默认值没有绑定到列或用户定义的数据类型,可以很容易地使用可以很容易地使用DROP DEFAULT将其除去。如将其除去。如下为删除用户创建的名为下为删除用户创建的名为datedflt的默认值。的默认值。use pubs go if exists(select name from sysobjects where name=datedflt and type=d)d
18、rop default datedflt【例例】除去绑定到列的默认值。】除去绑定到列的默认值。解除绑定与解除绑定与authors表中表中phone列关联的默认值,然后除列关联的默认值,然后除去名为去名为phonedflt的默认值。的默认值。use pubs go if exists(select name from sysobjects where name=phonedflt and type=d)begin exec sp_unbindefault authors.phone drop default phonedflt end规规 则则 Rule 规则也是一种数据库对象,它可以实现一种与
19、规则也是一种数据库对象,它可以实现一种与CHECK约束功能相似的数据完整性检测功能。约束功能相似的数据完整性检测功能。规则是对录入到列中的数据所实施的完整性约束条件,规则是对录入到列中的数据所实施的完整性约束条件,指定插入到列中的可能值指定插入到列中的可能值。CHECK约束是与一个数据表相联系的,而规则对象则约束是与一个数据表相联系的,而规则对象则是独立于数据表而创建的。是独立于数据表而创建的。规则可以被关联到一列或几列,及用户定义的数据类型。规则可以被关联到一列或几列,及用户定义的数据类型。每列或每个用户定义数据类型只能同时关联一个规则。每列或每个用户定义数据类型只能同时关联一个规则。创建规
20、则对象(企业管理器)创建规则对象(企业管理器)展开需要创建规则对象的数据库;展开需要创建规则对象的数据库;右键单击右键单击“Rules”;选择选择“New Rule”菜单;菜单;在在“Rule Properties”对话框的对话框的“Name”中输入规则中输入规则对象的名称,在对象的名称,在“Text”中输入规则值;中输入规则值;单击单击“确定确定”。创建规则对象(创建规则对象(T-SQL语句)语句)语法格式为:语法格式为:CREATE RULE 规则名规则名 AS 条件表达式条件表达式 条件表达式是定义规则的条件,可以是条件表达式是定义规则的条件,可以是 WHERE 子句中子句中任何有效的表
21、达式,并且可以包含诸如算术运算符、关任何有效的表达式,并且可以包含诸如算术运算符、关系运算符和谓词(如系运算符和谓词(如 IN、LIKE、BETWEEN)之类的元)之类的元素。素。规则规则不能引用列或其他数据库对象不能引用列或其他数据库对象。可以包含不引用数。可以包含不引用数据库对象的内置函数。据库对象的内置函数。条件表达式包含一个变量,条件表达式包含一个变量,每个局部变量的前面都有每个局部变量的前面都有一个一个符号。符号。该表达式引用通过该表达式引用通过 UPDATE 或或 INSERT 语句输入的值。语句输入的值。在创建规则时,可以使用任何名称或符号表示值,但在创建规则时,可以使用任何名称
22、或符号表示值,但第一个字符必须是第一个字符必须是 符号。符号。创建规则对象(创建规则对象(T-SQL语句)语句)【例例】创建一个规则,用以限制插入该规则所绑定的列】创建一个规则,用以限制插入该规则所绑定的列中的整数范围。中的整数范围。create rule range_rule as range=$1000 and range$20000【例例】创建一个规则,用以将输入到该规则所绑定的列】创建一个规则,用以将输入到该规则所绑定的列中的实际值限制为只能是该规则中列出的值。中的实际值限制为只能是该规则中列出的值。create rule list_rule as list in(1389,0736,
23、0877)应用规则对象(企业管理器)应用规则对象(企业管理器)展开需要创建规则对象的数据库;展开需要创建规则对象的数据库;在对象上右键单击在对象上右键单击“属性属性”;单击单击“Rule Properties”对话框的对话框的“Bind Columns”按钮;按钮;单击单击“Bind Rule to Columns”对话框的对话框的“Table”下拉按钮,下拉按钮,选择数据表;选择数据表;在在“Unbound columns”栏中选择需要绑定的列;栏中选择需要绑定的列;单击单击“Add”按钮;按钮;单击单击“确定确定”。应用规则对象(应用规则对象(T-SQL语句)语句)规则创建后,需要将其捆绑
24、到列上或用户自定义的规则创建后,需要将其捆绑到列上或用户自定义的数据类型上,当向捆绑了规则的列或使用捆绑了规数据类型上,当向捆绑了规则的列或使用捆绑了规则的用户自定义数据类型的所有列插入或更新数据则的用户自定义数据类型的所有列插入或更新数据时,新的数据必须符合规则。时,新的数据必须符合规则。语法格式为:语法格式为:sp_bindrule rulename=规则名规则名,objname=对象名对象名 ,futureonly=futureonly_flag 对象名是要绑定规则的表和列或者用户定义数据类对象名是要绑定规则的表和列或者用户定义数据类型的名称。型的名称。如果对象名没有采取如果对象名没有采
25、取table.column形式,则认为它形式,则认为它属于用户定义数据类型。属于用户定义数据类型。默认情况下,用户定义数据类型的现有列继承默认情况下,用户定义数据类型的现有列继承rule,除非规则直接绑定到列中。除非规则直接绑定到列中。应用规则对象(应用规则对象(T-SQL语句)语句)futureonly_flag仅当将规则绑定到用户定义的数据仅当将规则绑定到用户定义的数据类型时才使用。类型时才使用。futureonly_flag 的数据类型为的数据类型为 varchar(15),默认值,默认值为为 NULL。将此参数在设置为。将此参数在设置为 futureonly 时,它会时,它会防止用户定
26、义数据类型的现有列继承新规则。防止用户定义数据类型的现有列继承新规则。如果如果 futureonly_flag 为为 NULL,那么新规则将绑定,那么新规则将绑定到用户定义数据类型的每一列,条件是此数据类型到用户定义数据类型的每一列,条件是此数据类型当前无规则或者使用用户定义数据类型的现有规则。当前无规则或者使用用户定义数据类型的现有规则。应用规则对象(应用规则对象(T-SQL语句)语句)【例例】将规则绑定到列。】将规则绑定到列。假设已经用假设已经用 CREATE RULE 语句在当前数据库中语句在当前数据库中创建名为创建名为today的规则,此示例将规则绑定到的规则,此示例将规则绑定到 em
27、ployees表的表的hire date列。将行添加到列。将行添加到employees 时,按照时,按照today 规则检查规则检查hire date列的数据。列的数据。exec sp_bindrule today,employees.hire date go【例例】将规则绑定到用户定义的数据类型。】将规则绑定到用户定义的数据类型。假设存在规则假设存在规则rule_ssn和名为和名为ssn的用户定义数据类型,的用户定义数据类型,此示例将此示例将rule_ssn绑定到绑定到ssn。在。在CREATE TABLE语语句中,类型句中,类型ssn的列继承的列继承rule_ssn规则。类型规则。类型 s
28、sn的现的现有列也继承有列也继承rule_ssn规则,除非为规则,除非为 futureonly_flag指指定了定了futureonly 或者在或者在ssn 上直接绑定了规则。上直接绑定了规则。绑定绑定到列的规则始终优先于绑定到数据类型的规则。到列的规则始终优先于绑定到数据类型的规则。exec sp_bindrule rule_ssn,ssn go【例例】使用】使用 futureonly_flag。此示例将此示例将 rule_ssn 规则绑定到用户定义数据类型规则绑定到用户定义数据类型 ssn。因为已指定。因为已指定 futureonly,所以不影响类型,所以不影响类型 ssn 的现有列。的现
29、有列。exec sp_bindrule rule_ssn,ssn,futureonly go 解除绑定(企业管理器)解除绑定(企业管理器)展开需要删除规则对象的数据库;展开需要删除规则对象的数据库;在对象上右键单击在对象上右键单击“属性属性”;单击单击“Rule Properties”对话框的对话框的“Bind Columns”按钮;按钮;单击单击“Bind Rule to Columns”对话框的对话框的“Table”下拉按下拉按钮,选择数据表;钮,选择数据表;在在“Bound columns”栏中选择需要解除绑定的列;栏中选择需要解除绑定的列;单击单击“Remove”按钮;按钮;单击单击“
30、确定确定”。解除绑定解除绑定(T-SQL语句)语句)使用使用sp_unbindrule在当前数据库中为列或用户定义数在当前数据库中为列或用户定义数据类型解除规则绑定。据类型解除规则绑定。语法格式为:语法格式为:sp_unbindrule objname=对象名对象名 ,futureonly=futureonly_flag 对象名是要解除规则绑定的表和列或者用户定义数据对象名是要解除规则绑定的表和列或者用户定义数据类型的名称。类型的名称。futureonly=futureonly_flag仅用于解除用户定义仅用于解除用户定义数据类型规则的绑定。数据类型规则的绑定。【例例】为表】为表 employ
31、ees 的的 startdate 列解除规则绑定。列解除规则绑定。exec sp_unbindrule employees.startdate【例】为用户定义数据类型【例】为用户定义数据类型 ssn 解除规则绑定。这解除规则绑定。这将为该数据类型的现有列和将来的列解除规则绑定。将为该数据类型的现有列和将来的列解除规则绑定。exec sp_unbindrule ssn【例】为用户定义数据类型【例】为用户定义数据类型ssn解除规则绑定,现解除规则绑定,现有的有的 ssn 列不受影响。列不受影响。exec sp_unbindrule ssn,futureonly 删除规则(企业管理器)删除规则(企业
32、管理器)右键单击规则对象;右键单击规则对象;单击单击“删除删除”按钮;按钮;单击单击“Drop Object”对话框的对话框的“Drop All”按钮。按钮。删除规则删除规则 使用使用DROP RULE从当前数据库中删除一个或多从当前数据库中删除一个或多个用户定义的规则。个用户定义的规则。语法格式如下:语法格式如下:DROP RULE 规则名规则名 ,.n 【例例】解除绑定名为】解除绑定名为 pub_id_rule 的规则并将其除去。的规则并将其除去。use pubs go 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