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
注意
删除一个规则之前,必须首先取消所有与该规则绑定的联系。否则无法删除一个规则。
| 回书目 上一节 下一节 |
|
||||
| · Linux——从菜鸟到高手 · 如何优化IT 控制能耗 · 国际文档格式标准开战 · SQL Server入门到精通 · SQL Server 2008/2005.. · 贝恩资本携手华为22亿.. · ARP攻击防范与解决方案 · 华为员工自杀频频拷问.. |
· 初探敏捷开发 · 体验Visual Studio 200.. · SOA 面向服务架构 · CISSP认证成长之路 · 隐私保护技术探讨 · WCF开发基础 · 珊瑚虫QQ作者侵权案开庭 · 计算机网络维护入门 |
|||
|
||||
| · iSCSI应用与发展 · SQL Server 2008/2005.. · SOA 面向服务架构 · SQL Server 2008/2005.. · iSCSI应用与发展 · RAID——磁盘阵列基础 · 中间件应用技术专题 · SQL Server入门到精通 |
· 病毒查杀专题 · 国际文档格式标准开战 · Linux防火墙 · 打造安全服务器 · Sniffer安全技术从入门.. · SOA 面向服务架构 · ADSL应用面面俱到 · 入侵防护系统(IPS)初探 |
|||
|
||||
| · iSCSI应用与发展 · 中间件应用技术专题 · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · iSCSI应用与发展 · RAID——磁盘阵列基础 · 身份认证技术 |
· 病毒查杀专题 · 清除流氓软件——51CTO.. · Sniffer安全技术从入门.. · SOA 面向服务架构 · 了解统一威胁管理(UTM).. · ADSL应用面面俱到 · ADSL应用面面俱到 · 反垃圾邮件技术应用 |
|||