频 道 直 达 - 新闻 - 培训 - 软件 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 读书 - 博客 - BBS
51CTO.COM_中国最大的网络技术网站
找资料:

4.2.2 为自定义数据类型指定默认值和规则

作者: 周 涛 吕伟臣 王媛红编著 出处:清华大学出版社  2008-03-28 17:18    砖    好    评论   进入论坛
阅读提示:《SQL Server 2005数据库管理高级教程》本书侧重于介绍基于SQL Server 2005数据库应用程序的设计与开发知识。第四章主要介绍的是自定义数据类型、自定义类型和自定义函数的创建与使用方法。本文说的是为自定义数据类型指定默认值和规则。

4.2.2  为自定义数据类型指定默认值和规则

使用用户自定义数据类型的另一个优点是,可以灵活地为它们设置默认值和规则,下面分别进行介绍。

1. 为自定义数据类型指定默认值   

为用户自定义数据类型创建默认值的步骤如下所示。

(1) 首先使用CREATE DEFAULT语句创建一个默认对象。

(2) 然后使用sp_bindefault存储过程将该默认对象绑定到自定义数据类型之上。

下面通过示例进行说明。

【示例2】为自定义数据类型添加默认值。

以前面创建的自定义数据类型PasswordType为基础,在此为其添加一个默认值,当向数据表Account插入一条记录时,该字段的值被默认地设置为000000。完整过程如下。

(1) 首先需要创建一个默认对象。创建默认对象语句如下所示:

CREATE DEFAULT default_name
AS 表达式

其中,default_name表示将要创建的默认对象名称,而表达式就是要创建的默认值。在【查询编辑器】中输入以下SQL脚本,如下所示:

USE Northwind
GO 
CREATE DEFAULT Default_Password
AS   '000000'
GO

(2) 单击【执行】按钮创建名为Default_Password的默认值对象。展开Northwind数据库节点下的【可编程性】|【默认值】节点,即可看到刚刚创建的默认值对象Default_Password,如图4.7所示。

图4.7 创建的默认值对象Default_Password

(3) 接下来继续上面介绍的第二步,将默认对象Default_Password与自定义数据类型PasswordType绑定。执行绑定操作的Transact-SQL语句如下所示:

sp_bindefault [@defname = ] 'default' ,
[@objname = ]'object_name'

其中,@defname为由CREATE DEFAULT语句创建的默认对象,而@objname为要绑定默认值的用户定义数据类型或列名。在【查询编辑器】中输入下面的SQL脚本:

USE Northwind
GO
SP_BINDEFAULT 'Default_Password','PasswordType'
GO

(4) 单击【执行】按钮,将刚刚创建的默认对象Default_Password绑定到自定义数据类型PasswordType上。右击【对象资源管理器】中的默认值节点Default_Password,从弹出的快捷菜单中选择【查看依赖关系】命令,打开【对象依赖关系】对话框。选中【依赖于Default_Password的对象】单选按钮,即可显示与该默认对象绑定的数据对象。从图4.8中可以看出该默认对象与数据表Account中的PasswordType自定义数据类型进行了绑定。

图4.8 查看数据表Account与自定义数据类型的绑定关系

(5) 右击数据表Account,从弹出的快捷菜单中选择【修改】命令,打开数据表结构视图,选择该视图中的Password字段,查看下面的【列属性】选项卡,该选项卡中显示了与该字段相关的属性。查看【默认值或绑定】选项,该选项中的值为dbo.Default_Password,即刚刚创建的默认对象值,如图4.9所示。

图4.9 创建的默认对象值

(6) 为了测试绑定操作确实成功,可以为刚刚创建的数据表Account插入一条记录。在【查询编辑器】中输入以下SQL脚本:

USE Northwind
GO
INSERT INTO Account(AccountName,AccountType)
VALUES('小赵','1')
INSERT INTO Account(AccountName,AccountType)
VALUES('小钱','2')
GO
SELECT * FROM account

(7) 单击【执行】按钮,向数据表Account中插入两条记录,返回的结果集如图4.10所示。

图4.10 返回的结果

从图4.10中可以看出,虽然插入记录时没有为Password插入任何数据,但是插入示例记录时,Password字段中被插入了默认值000000。

提示   

数据库管理人员同样可以使用Microsoft SQL Server Management Studio为用户自定义数据类型指定默认值。右击【用户定义数据类型】数据,从弹出的快捷菜单中选择【新建用户定义数据类型】命令,打开【新建用户定义类型】对话框,在该对话框中可以为新建的用户定义数据类型设置默认值。通过Microsoft SQL Server Management Studio创建一个默认值为000000的用户定义数据类型PasswordType的具体设置如图4.11所示。

图4.11 用户定义数据类型PasswordType的具体设置


技巧
    

要删除一个默认值,可以使用如下的Transact-SQL语句。
DROP DEFAULT { [ schema_name . ] default_name } [ ,...n ] [ ; ]
其中的default_name即为要删除的默认对象。在【查询编辑器】中输入以下SQL脚本:

USE Northwind;
GO
IF EXISTS (SELECT name FROM sys.objects
WHERE name = 'Default_Password'
AND type = 'D')
DROP DEFAULT Default_Password
GO

上述SQL脚本用于在系统对象视图中查找名为Default_Password,类型为D表示默认的对象,如果该对象存在,则将其删除。单击【执行】按钮,会发现【查询编辑器】将报告如下错误信息:

消息3716,级别16,状态3,第4 行
无法删除默认值'Default_Password',因为它已绑定到一个或多个列。

技巧
    
出现错误是因为尚存在与该默认对象绑定的自定义数据对象。取消与该默认对象绑定的所有用户自定义数据类型,然后再单击【执行】按钮,即可成功地删除该默认对象。 

提示    
在删除任何一个默认对象之前,必须首先取消所有与之绑定的对象,即首先需要取消所有依赖于该默认对象的绑定关系。 

技巧    

取消默认对象绑定关系的Transact-SQL语句如下所示。

sp_unbindefault [ @objname = ] 'object_name'

其中object_name为与默认对象相绑定的对象名称。
上例中由于默认对象Default_Password与PasswordType字段绑定,因此如果想取消该绑定关系则需要输入下面的Transact-SQL语句:

USE Northwind;
GO
SP_UNBINDEFAULT 'PasswordType'
GO

单击【执行】按钮,显示如下消息:

已解除了数据类型与其默认值之间的绑定.
已解除了指定用户数据类型的列与其默认值之间的绑定.

此时,PasswordType已与Default_Password解除了绑定关系,因此再次插入一条记录时,Password字段不会被自动填写默认值000000。如果想进一步删除该默认对象,也可以再次运行上述用于删除默认对象Default_Password的Transact-SQL脚本。此次默认对象Default_Password将会被成功地删除。 

2. 为自定义数据类型指定规则

很多情况下,可能需要某一字段值必须满足某些条件来约束字段的设置,这就是为自定义数据类型指定规则的含义,例如,要求保存某人身份证的字段必须为18位,输入15位以下的将报告错误;要求输入的电话号码只能为数字等。与为自定义数据类型指定默认值一样,为自定义数据类型指定规则同样分为两步:

(1) 首先需要创建一个规则,创建规则的语句如下所示:

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

其中rule_name为要创建的规则名称,Condition_Expression则为具体的规则。

(2) 将规则与指定的数据类型或字段绑定,绑定规则和数据类型的Transact-SQL语句如下所示:

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

其中参数@rulename用于指定需要绑定的规则名称,参数@objname用于指定绑定的对象名称。当需要将规则绑定到别名数据类型时,需要使用参数@futureonly。该参数被设置为futureonly时,可以防止具有别名类型的现有列继承新的规则。下面结合前面的例子来说明如何为自定义数据类型指定规则。

【示例3】为自定义数据类型指定规则。

例如,如果需要为Password字段创建一个约束条件,要求Password字段中的数据最小由6个字符组成。完整的设计过程如下。

(1) 在【查询编辑器】中输入下面的SQL脚本:

USE Northwind
GO
CREATE RULE PasswordLength_rule
AS 
LEN(@Password) >= 6 AND LEN(@Password) <=10

(2) 单击【执行】按钮,创建名为PasswordLength_rule的规则。展开【对象资源管理器】中的【可编程性】|【规则】节点,查看刚刚创建的规则PasswordLength_rule,如图4.12所示。

图4.12 创建的规则PasswordLength_rule

(3) 继续在【查询编辑器】中输入下面的SQL脚本:

USE Northwind
GO
SP_BINDEFAULT 'Default_Password','PasswordType'
GO

(4) 单击【执行】按钮,将该规则与自定义数据类型PasswordType绑定。右击【对象资源管理器】中的新建规则PasswordLength_rule,从弹出的快捷菜单中选择【查看依赖关系】命令,打开【对象依赖关系】窗口,查看该规则的依赖关系,如图4.13所示。

图4.13 查看规则的依赖关系

(5) 下面向数据表Account中插入一些示例记录以测试刚才创建的规则是否起作用。在【查询编辑器】中输入下面的SQL脚本:

USE Northwind
GO
INSERT INTO Account(AccountName,Password,AccountType)
VALUES('小李','1234','1')
GO

(6) 单击【执行】按钮,【查询编辑器】将报告错误信息,如下所示:

消息513,级别16,状态0,第3 行
列的插入或更新与先前的CREATE RULE 语句所指定的规则发生冲突。该语句已终止。冲突发生于数据库'Northwind',表'dbo.Account',列'Password'.
语句已终止.

(7) 由于输入的示例数据中,Password字段的值为1234,长度小于5,所以插入此记录时该规则将终止上述操作。继续在【查询编辑器】中输入以下示例测试数据:

USE Northwind
GO
INSERT INTO Account(AccountName,Password,AccountType)
VALUES('小李','12$34','1')
GO

(8) 单击【执行】按钮,由于输入的Password中包含$字符,故插入该记录的操作依然不能完成。
(9) 此外,如果想为上面创建的EMLType数据类型创建一个规则,该规则要求输入的EML字段中必须包含@和.两个字符,否则,向用户报错。在【查询编辑器】中输入以下SQL脚本:

USE Northwind
GO
CREATE RULE EML_rule
AS 
 @EML LIKE '%@%.%'

(10) 单击【执行】按钮,创建上述规则。该规则指定了EML字段的形式。继续在【查询编辑器】中输入以下SQL脚本:

USE Northwind
GO
SP_BINDRULE 'EML_rule','EMLType'
GO

(11) 单击【执行】按钮,将刚刚创建的规则EML_rule与用户自定义数据类型EMLType绑定。右击【对象资源管理器】,从弹出的快捷菜单中选择【查看依赖关系】命令,打开【对象依赖关系】对话框。选中该对话框中的【[EMLType]依赖的对象】单选按钮,查看该数据类型依赖的对象,可以发现该自定义数据对象依赖于规则EML_rule,如图4.14所示。

图4.14 查看该数据类型依赖的对象

(12) 在【查询编辑器】中输入插入示例记录的SQL脚本:

USE Northwind
GO
INSERT INTO Account(AccountName,Password,AccountType,EML)
VALUES('小李','1234567','1','11234@163.com')
GO

(13) 单击【执行】按钮,插入数据表Account中的记录,如图4.15所示。

图4.15 插入数据表Account中的记录

(14) 继续在【查询编辑器】中输入下面的SQL测试代码:

INSERT INTO Account(AccountName,Password,AccountType,EML)
VALUES('小周','1234567','1','xiaozhou')
GO

(15) 单击【执行】按钮,【查询编辑器】将报告如下的错误信息:

消息513,级别16,状态0,第8 行
列的插入或更新与先前的CREATE RULE 语句所指定的规则发生冲突.该语句已终止.冲突发生于数据库'Northwind',表'dbo.Account',列'EML'.
语句已终止.

(16) 由于上述记录中的EML字段值不符合规则EML_rule,故上述插入记录的操作被终止。
与为用户自定义数据指定默认值一样,也可以使用Microsoft SQL Server Management Studio为一个用户自定义数据类型或字段指定规则,但是却无法通过管理工具创建一个规则。例如,可以使用管理工具创建一个名为EMLType的自定义类型,并同时为其指定一个规则。右击【用户定义数据类型】,从弹出的快捷菜单中选择【新建用户定义数据类型】命令,打开【新建用户定义数据类型】对话框,按照图4.16所示的内容填写该对话框。

图4.16 【新建用户定义数据类型】对话框

(17) 单击【规则】项对应的按钮,打开【选择对象】对话框,如图4.17所示。

图4.17 【选择对象】对话框

(18) 单击【选择对象】对话框中的【浏览】按钮,打开【查找对象】对话框,选中【匹配的对象】列表中的[dbo].[EML_rule]选项,如图4.18所示。

图4.18 列表中的[dbo].[EML_rule]选项

(19) 连续单击两次【确定】按钮,即可为新创建的用户定义数据类型EMLType绑定规则EML_rule。

技巧    
取消与一个自定义数据类型绑定的规则可使用如下形式的Transact-SQL语法:

sp_unbindrule [ @objname = ] 'object_name'

其中,object_name为欲取消规则的对象(例如,自定义数据类型或字段等)。 

试一试    
例如要取消数据类型PasswordType的Transact-SQL语句如下所示。

USE Northwind
EXEC SP_UNBINDRULE 'PasswordType'
GO

单击【执行】按钮即可取消用户自定义数据类型PasswordType与规则PasswordLength_rule之间的绑定关系。如果用户想进一步删除规则PasswordLength_rule,可使用如下的Transact-SQL脚本:

IF EXISTS (SELECT name FROM sys.objects
WHERE name = 'PasswordLength_rule'
AND type = 'R')
DROP DEFAULT PasswordLength_rule
GO

注意    
删除一个规则之前,必须首先取消所有与该规则绑定的联系。否则无法删除一个规则。 

【责任编辑:董书 TEL:(010)68476606】

回书目   上一节   下一节
专题
Sun以10亿美元并购开源数据库厂商MySQL
Windows Home Server 家用服务器专题
Windows Server 2008专题
Oracle数据库开发之PL/SQL基础应用
Oracle数据库开发基础教程
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 最 大 的 网 络 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
技术人求职简历完备手册
技术人求职简历完备手册
Visual Studio 2005开发基础
Visual Studio 2005开发基础
Linux——从菜鸟到高手
Linux——从菜鸟到高手
· Linux——从菜鸟到高手
· 如何优化IT 控制能耗
· 国际文档格式标准开战
· SQL Server入门到精通
· SQL Server 2008/2005..
· 贝恩资本携手华为22亿..
· ARP攻击防范与解决方案
· 华为员工自杀频频拷问..
· 初探敏捷开发
· 体验Visual Studio 200..
· SOA 面向服务架构
· CISSP认证成长之路
· 隐私保护技术探讨
· WCF开发基础
· 珊瑚虫QQ作者侵权案开庭
· 计算机网络维护入门
清除流氓软件——51CTO特别专题
清除流氓软件——51CTO特别专..
ARP攻击防范与解决方案
ARP攻击防范与解决方案
iSCSI应用与发展
iSCSI应用与发展
· iSCSI应用与发展
· SQL Server 2008/2005..
· SOA 面向服务架构
· SQL Server 2008/2005..
· iSCSI应用与发展
· RAID——磁盘阵列基础
· 中间件应用技术专题
· SQL Server入门到精通
· 病毒查杀专题
· 国际文档格式标准开战
· Linux防火墙
· 打造安全服务器
· Sniffer安全技术从入门..
· SOA 面向服务架构
· ADSL应用面面俱到
· 入侵防护系统(IPS)初探
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
iSCSI应用与发展
iSCSI应用与发展
· iSCSI应用与发展
· 中间件应用技术专题
· SQL Server入门到精通
· SQL Server 2008/2005..
· SOA 面向服务架构
· iSCSI应用与发展
· RAID——磁盘阵列基础
· 身份认证技术
· 病毒查杀专题
· 清除流氓软件——51CTO..
· Sniffer安全技术从入门..
· SOA 面向服务架构
· 了解统一威胁管理(UTM)..
· ADSL应用面面俱到
· ADSL应用面面俱到
· 反垃圾邮件技术应用