第8章视图和用户定义数据类型155第8章视图和用户定义数据类型本章学习目标在数据库中,有时为了查询的方便,可以创建一个视图,然后通过视图来简化查询。而有时在设计表时,SQLServer提供的系统数据类型并不能完全满足需要,这时就需要数据库的实现者自己来定义一些数据类型。本章主要介绍了视图和用户自定义数据类型的各种具体操作方法,主要内容包括视图的基本知识,视图的创建、查看、修改和删除方法,以及用户自定义数据类型的创建、查看和删除方法等。通过本章的学习,读者就应能够掌握视图和用户自定义数据类型的各种具体操作方法,并能够在对数据库的操作过程中对其进行应用,真正做到学以致用。学习重点与难点视图的概念和优缺点视图的查看和管理视图的修改和删除用户自定义数据类型的创建用户自定义数据类型的管理8.1视图的概念视图是从一个或多个表(视图)导出的表,是数据库用户使用数据库的观点。它是用户查看数据库表中数据的一种方式,是基于某个查询结果的虚拟表,用户通过它来浏览表中感兴趣的部分或全部数据。而数据的物理存放位置仍然在表中,这些表称作视图的基表。一个视图可以派生于一个或多个基表,也可以从其它视图中派生。视图实际上发挥着过滤数据的作用。定义视图的查询语句可以从一个表、多个表或者其他视图中引用数据。发布式数据库查询语句还可以定义、引用不同数据源的数据库视图。一般地,视图的内容包括:基表的列的子集或行的子集;两个或者多个基表的联合;两个或者多个基表的连接;基表的统计汇总;另外一个视图的子集;视图和基表的混合。视图和表是有本质区别的:视图在数据库中存储的是视图的定义,而不是查询的数据。当SQLSERVER处理视图的操作时,它会在数据库中找到视图的定义,然后把对视图的查询转化为视图基本表的查询。8.2视图的优缺点视图常用于聚焦、简化和定制用户对数据库的感知和控制,它也可以作为一种安全机制,以便使用户只能通过视图来访问数据,而不给其访问基表的权限。具体来讲,使用视图有下列优点:(1)聚焦特定的数据。视图使用户只能看到和操纵与他们有关的数据,不需要了解和使用的数据不加入视图,这样可以提高数据的安全性。(2)简化数据操作。通过将复杂查询(如多表的连接查询)定义为视图,可以简化操作,不必在每次需要数据时都要提供所需的条件、限制等。中文版SQLServer2000实用基础教程156(3)定制用户数据。视图可以让使用同一数据库的不同用户看到不同的数据。(4)导入/导出数据。可以使用视图将数据导出到其他应用程序,也可以将数据文件中的数据导入到视图中。(5)合并分离的数据。使用UNION关键字可以将两个或更多基于不同表的查询结果合并为一个单独的结果集,可以将这样的结果集创建为一个视图,让用户看起来就象一个单独的表一样。(6)屏蔽数据库的复杂性(隔离变化)。用户不必了解复杂的数据库中的表结构,并且数据库表的更改也不影响用户对数据库的使用。(7)简化用户权限的管理。只需授予用户使用视图的权限,而不必指定用户只能使用表的特定列,也增加了安全性。(8)便于数据共享。各用户不必都定义和存储自己所需的数据,可共享数据库的数据,这样同样的数据只需存储一次。使用视图也有其相应的缺点。例如,造成系统性能下降,并且会使用户对数据的修改受到很大限制等。8.3创建视图用户在数据库中创建了一个或多个表后,为了方便查询其中的数据,就可以为其创建相应的视图,用以代替表来完成从表中查询、插入、更新和删除数据的操作。创建视图有两种方法:使用企业管理器和使用T-SQL语句。8.3.1使用企业管理器创建视图使用企业管理器创建视图的步骤如下:(1)在企业管理器的树形目录中展开服务器组、服务器。(2)展开Supermarket数据库,用鼠标右键单击“视图”目录,在弹出的快捷菜单中选择“新建视图…”选项,打开如图8-1所示的窗口。图8-1新建视图窗口(3)在图8-1所示窗口的图表窗格(即最上面的窗格)中单击鼠标右键,在弹出的快捷菜单中选择“添加表…”命令,弹出如图8-2所示的对话框。第8章视图和用户定义数据类型157图8-2添加表(4)此对话框包括三个选项卡,分别显示了当前数据库的用户表、用户视图和函数。选定表后单击“添加”按钮,可以添加创建视图的基表,重复此操作可以添加多个基表。添加完毕后单击“关闭”按钮。(5)添加完基表,可以如图8-1所示窗口的图表窗格中看到新添加的基表以及基表之间的外键引用关系,如图8-3所示。图8-3添加Goods表和Supplier表作为基表(6)在图8-3中,每个基表的每一列的左边都有一个复选框,选择该复选框,可以指定该列在视图中被引用。图8-3的窗口中第二个窗格是条件窗格,在这个窗格中可以指定查询条件。条件窗格中显示了所有在图表中选中的、要在视图中引用的列。也可以对每一列选中或取消选中“输出”复选框,来控制该列是否在视图中出现。(7)在基表中选中“货品名称”列、“存货量”列、“进货价格”列、“供应商”列和“负责人”列前面的复选框。如图8-5所示。(8)图8-5所示窗口的条件窗格中有“准则”列,它用于输入对在视图中出现的列的限制条件,该条件相当于定义视图的查询语句中的WHERE子句。例如,在“存货量”列输入10,即创建的视图只包括存货量大于10的货品记录。(9)要在视图的定义中依照某一列进行分组,可以在图8-5所示窗口的条件窗格中用鼠标右键单击该列,并在弹出的快捷菜单中选择“分组”命令。(10)在图8-5所示窗口的任何地方单击鼠标右键,在弹出的快捷菜单中选择“属性”命令,可以打开如图8-6所示的对话框。中文版SQLServer2000实用基础教程158图8-5选择视图出现的列图8-6属性对话框(11)在属性对话框中,选中“顶端”复选框可以限制视图最多可以包含多少条记录,选中“DISTINCT值”复选框可以指定在视图中不包含相同的记录,选中“加密浏览”复选框可以对视图定义加密。所有设置进行完毕后,可以在创建视图的窗口中的第三个窗口中查看视图查询条件的T-SQL语句,如图8-7所示。用户也可以自己修改该T-SQL语句,修改完成后可以单击工具栏上的按钮,检查该T-SQL语句的语法是否正确。(12)要运行并输出该视图的结果,可以单击鼠标右键,在弹出的快捷菜单中选择“运行”命令,或是在工具栏中单击按钮。在窗口的最下面的输出窗格中将会显示按照中间的T-SQL语句生成的视图内容。(13)单击工具栏上的按钮,可以保存创建的视图。视图创建完成。8.3.2使用T-SQL语句创建视图使用T-SQL语句创建视图的语法格式为:CREATEVIEWview_name[(column[,...n])]第8章视图和用户定义数据类型159[WITHENCRYPTION]ASselect_statement[WITHCHECKOPTION]图8-7查看T-SQL语句其中各选项的含义如下:view_name:所创建的视图名。Column:参数定义视图列名,省略该参数时,视图中的列名来自源表中列的名称。如果查询中包含计算列,那么必须指定列名。Select_statement:为视图定义语句,它定义通过视图可以浏览到的表或其他视图中的哪些数据,它是SELECT语句。SELECT语句中可以使用多个表及其他视图,也可以使用UNION关键词合并起来的多个SELECT语句。WITHENCRYPTION:SQLServer将创建视图的CreateView语句的文本存储在Syscomments系统表中,使用WITHENCRYPTION选项要求在存储CreateView语句的文本时对它进行加密,这使得任何人无法使用系统存储过程SP_HELPTEXT或其他方法从Syscomments系统表中检索系统定义文本。WITHCHECKOPTION:强制所有通过视图修改的数据满足select_statement语句中指定的条件。当通过视图修改一条记录时,WITHCHECKOPTION保证修改的数据被提交前仍然可以通过视图看到。如果不使用该选项,那么当通过视图添加或修改数据记录时,如果它们不满足定义视图的查询条件(即select_statement语句中指定的条件),则它们将从视图中消失。例如,以下代码在Supermarket数据库中创建视图view_supermarket,显示每种货品的名称、存货量、进货价格、供应商和负责人,并要求对视图定义文本进行加密存储:USESupermarketGOCREATEVIEWview_supermarketWITHENCRYPTIONASSELECT货品名称,存货量,进货价格,供应商,负责人中文版SQLServer2000实用基础教程160FROMGoods,SupplierWHEREGoods.供应商号=Supplier.供应商号再如,以下代码在Sales数据库中创建一个视图view_sales,其内容为每个货品的订单金额总和。USESalesGOCREATEVIEWview_sales(货品名称,金额)WITHENCRYPTIONASSELECT货品名称,SUM(数量*单价)FROMOrdersGROUPBY货品名称8.3.3创建和使用视图的注意事项学会了创建视图之后,还需了解一下在其创建和使用过程中要注意的相关事项。一般来讲,创建和使用视图进,需注意下列事项:(1)只有在当前数据库中才能创建视图。(2)视图的命名必须遵循标识符命名规则,不能与表同名,且对每个用户视图名必须是惟一的,即多不同用户,即使定义相同的视图,也必须使用不同的名字。(3)不能把规则、默认值定义绑定在视图之上,不能将触发器与视图相关联。(4)不能在视图上建立任何索引,包括全文索引。(5)一个视图最多可以引用1024个列。(6)可以将视图建立在其他视图或者引用视图的过程之上,SQLServer2000中允许最多32层的视图嵌套。(7)定义视图的查询语句中不能包括ORDERBY、COMPUTE、COMPUTEBY子句或是INTO等关键词。(8)不能创建临时视图,也不能在临时视图是创建视图。(9)不能对视图进行全文查询,尽管基表上可能有全文索引而使用全文查询。(10)默认状态下,视图中的列继承它们在基表中的名称。存在以下情况时,在创建视图时需要明确给出每一列的名称:视图中的某些列来自表达式、函数或常数。视图中两个或多个列在不同表中具有相同的名称。希望在视图中的列使用不同于基表中的列名时。在创建视图时,并非所有的SELECT子查询都是合法的,有的SQL语句在这里是禁止使用的,例如:SELECTINTO、COMPUTE或COMPUTEBY子句以及ORDERBY子句等。除此之外,生成的临时表也是禁止使用的。但在对视图进行查询时,仍可像对表格一样使用ORDERBY等语句,尽管有这些限制,但视图中可以包含的内容依然非常丰富。在视图中可以使用的内容包括:统计函数、GROUPBY子句、JOIN子句、DISTINCT子句以及UNION子句等。第8章视图和用户定义数据类型161视图可以建立在其他视图的基础上(最多可以嵌套32层)。8.4管理视图对视图所进行的管理以通常包括查询、修改、删除和更新等操作。一般来讲,视图一经定义以后,就可以像表一样随时被查询、修改、删除或更新。8.4.1查看视图的基本信息SQLSERVER允许用户获得视图的一些有关信息,如:视图的名称、视图的所有者、创建的时间等等。视图的信息存放在以下几个系统表中:sysobjects:存放视图的名称等信息。syscolumns:存放视图中定义的列。sysdenpends:存放视图的依赖关系。syscomments:存放定义视图的文本。有四种方法可以查看视图的信息:使用企业管理器、使用T_SQL语句、使用存储过程和查询information_schema.views获得视图信息。1、使用企业管理器使用企业管理器查看视图信息的具体操作步骤如下:(1)在企业管理器的树形目录中,展开服务器组、服务器。(2)展开“数据库”,再展开Sales数据库。(3)选中“视