18. 检视表的建立与使用
何谓检视表
检视表概念
建立检视表
检视表的修改与删除
SQL Server 2000 中检视表的增强功能
本章总结
在 第17章 中,我们学习了索引,索引是一种数据库辅助结构,独立于数据库的数据结构,但是却与存取数据库的数据有关。换句话说,索引是一种独立结构,但是和数据整合性地连结在一起。下面我们将学习另一种数据库辅助结构:检视表。和索引一样,检视表和数据分开存在,使用时才和数据作连结。检视表在使用者存取数据前,先将数据筛选或处理。本章中将详细学习什么是检视表、检视表与数据的关联性,检视表的使用、建立和管理。另外还会看看检视表在Microsoft SQL Server 2000的新增功能。
何谓检视表

您可以将 检视表 (view)想象成是虚拟数据表,由SELECT陈述式查询的结果集组成。对使用者来说,检视表看起来就像一般的数据表,但是其中所包含的数据可能来自不同数据表查询后所得来的结果。事实上,使用检视表的方法和使用资料表可以说是一样的,使用者可以在T-SQL陈述式中引用检视表,方法和引用数据表相同,如SELECT、INSERT、UPDATE和DELETE都可以在检视表中操作。
实际上,检视表为被预先定义的SQL陈述式。当存取检视表时,SQL Server Query Optimizer就合并执行查询陈述式与预先定义检视表的SQL陈述式。
使用检视表的优点在于,不用复制数据就可以建立具有不同属性的检视表。检视表在很多情形下是很有用的。在本章后面我们会看到,检视表可用于保障数据的安全性、呈现查询结果的简易性,表达数据呈现的逻辑性。此外,也可以使用检视表来合并已经分割的资料。
检视表概念

本节中会学习不同类型的检视表,以及检视表的使用优点与限制。
检视表类型

不同类型的检视表可依使用状况,建立下面任何一种形式的检视:
数据表中数据行的子集 检视表仅包括特定的数据行。可能是最普遍的检视表类型,欲显示简化后的数据,或基于安全性的考虑时使用。

数据表中数据列的子集 检视表仅包括特定的数据列,亦可以基于安全性的理由使用。

联结多个数据表 您可以藉由联结操作建立检视表,使用检视表可以简化繁杂的联结操作。

汇总信息 检视表仅显示汇总后的数据,简化复杂的操作过程。

在本章稍后的 〈使用T-SQL建立检视表〉 一节中会介绍这些类型检视表不同的呈现方式。
检视表也可用于合并分割的数据,基于管理上的方便,大型的数据表可能被分割为数个小型的数据表。使用者可依需要建立检视表,使数个小型数据表合并在一个大型的虚拟数据表上。
检视表的优点

使用检视表的第一个优点是,检视表所呈现的数据永远是实时数据。因为检视表由SELECT陈述式定义,因此无论何时存取检视表,都会执行SELECT陈述式,也就是当要求数据时才执行查询。因此,尽管底层的数据表中的数据可能会变更,但检视表呈现的永远为最新资料。
使用检视表的第二个优点是,检视表具有和底层数据表不同的安全性层级。因为定义检视表的查询是依使用建立时的安全性层级执行。因此,检视表可以隐藏不希望被某一层级使用者看到的数据。在本章 〈资料行的子集〉 一节中会再讨论这个功能。
检视表的限制

SQL Server对检视表的建立和使用有一些限制,限制如下:
资料行限制 检视表最多只能引用1024个资料行。如果超过这个限制,就要利用其它方法引用。

数据库限制 检视表只能在现行存取数据库的数据表中建立。

安全性限制 检视表的建立者必须拥有存取检视表所引用所有数据行的权限。

数据完整性规则 任何更新、修改等操作都不能破坏数据的完整性规则。例如,如果底层数据表不允许NULL值,那么检视也不允许NULL值。

巢状检视表层级限制 检视表可以建立在其它检视表之上。换句话说,可以建立一个可存取其它检视表的检视表,检视表的巢状层次最高可达32层。

SELECT陈述式限制 检视表的SELECT陈述式不能包括ORDER BY、COMPUTE、COMPUTE BY陈述式及INTO关键词。

________________________________________
说明
关于检视表的其它限制,可在《在线丛书》索引中输入『建立检视表』,并进入 建立检视表 主题。
________________________________________
建立检视表

同索引一样,可利用不同的方法建立检视表。如果在日后会建立更多的检视表,建议利用CREATE VIEW陈述式(T-SQL陈述式)建立检视表,因为这样可以将T-SQL陈述式储存在指令码中,当要再建立检视表时再重复叫出指令码来修改使用。其它建立检视表的方法为,使用SQL-Server Enterprise Manager和建立检视表精灵。
与索引和其它多数操作一样,如果将来要建立多个检视表,建议使用T-SQL命令。在指令码中输入T-SQL叙述,以后便可以多次编辑和使用档案。如果了解所要建立的检视,还可以使用SQL Server Enterprise Manager简单地建立检视。最后,您可以使用建立检视表精灵浏览建立检视表的过程,不管是初学者或是专家,建立检视表精灵都一样有用。
使用T-SQL建立检视表

使用T-SQL建立数据表的步骤很简单:使用ISQL、OSQL或SQL Server Query Analyzer,并执行CREAT VIEW建立来检视表。如之前所述,您可以将T-SQL命令存入指令码中,待日后欲使用时呼叫出来修改使用即可(请您记得将数据库定义一起存入指令码,以便日后重建数据库时使用)。
以下为CREATE VIEW命令的语法:
CREATE VIEW view_name [(column, column, ...)]
[WITH ENCRYPTION]
AS
your SELECT statement
[WITH CHECK OPTION]
建立检视表时,您可以启动两个选项更改检视表的行为的选项。一个选项为使用WITH ENCRYPTION关键词,另一个选项为使用WITH CHECK OPTION,或是两者一起使用也可以。现在让我们来仔细研究这几个选项。
WITH ENCRYPTION关键词会加密检视表的定义。SQL Server使用的加密方式和密码的方式相同。这种安全机制令特定使用层级的使用者无法得知哪些数据表正在被存取。
WITH CHECK OPTION关键词指定对检视表的任何数据修改陈述式都必须遵守定义检视表的SELECT陈述式中所设的基准。举例来说,如果在检视表上建立一个数据列,而该数据列无法在检视表上显示,这种修改就不允许。假设将一个检视表定义为「选取所有财务部门员工相关信息」,通常情况下,如果您没有指定WITH CHECK OPTION选项,您就可以将「部门」数据行的值从「财务」改为其它部门。如果指定了WITH CHECK OPTION,则不允许做这种修改,因为变更任一数据列的「部门」数据行的值,您将无法透过检视表再存取该数据列。WITH CHECK OPTION关键词可指定不可以在检视表中执行会导致无法在检视表中存取某列的变更。
只要修改检视表中SELECT陈述式的定义,您就可以建立任何您所需要的检视表,例如选择数据行或数据列的子集,或是联结操作。下面将学习如何使用T-SQL建立不同类型的检视表。
资料行子集

由数据行子集所构成的检视表可为您欲公开的数据提供某种程度的安全性。现在看看以下范例。假设一个公司内部数据库中,有一个命名为Employee的数据表,所包含的资料行如图18-1所示。



图18-1 Employee资料表
数据表中的大部分数据都属于私人数据,不能被其它员工看到。不过,某些数据却必须让一般员工检视。这里的重点在于建立一个可以允许所有员工存取特定资料的检视表,即可解决问题,另外,检视表也可以避免数据库中其它的数据表含有重复的员工数据。
使用下面的T-SQL陈述式,为Employee资料表建立可以存取name、phone和office数据行的检视表:
CREATE VIEW emp_vw
AS
SELECT name,
phone,
office
FROM Employee
所建立的检视表所包括的数据行如图18-2所示。尽管所有的数据皆存在于底层数据表,但透过检视表存取数据的使用者只能看到检视表中所选取的资料行。由于检视表可以拥有和底层数据表不同的安全性层级,所以虽然检视表允许任何人存取,但底层数据表仍然是安全的。换句话说,可以只允许人力资源部门存取Employee数据表的所有数据,而其它部门员工只能使用检视表。
资料列子集

由数据列子集构成的检视表可以限制使用者能存取的数据列。假设Employee数据表填入了数据,如图18-3所示。在本例中,我们不在数据行设限制,而是透过WHERE陈述式来限制数据列,如下所示:



图18-2 emp_vw检视表
CREATE VIEW emp_vw2
AS
SELECT *
FROM Employee
WHERE Dept = 1



图18-3 包含数据的Employee数据表
检视表的结果只显示在部门1工作的员工的资料列,如图18-4所示。假设人力资源部门必须只存取某部门内部员工的记录,这个检视表便很有用。如同由数据行子集构成的检视表一样,由数据列子集构成的检视表也可分配与数据库不同的安全性层级。



图18-4 emp_vw2检视表
联结

透过在检视表中定义联结,实际的JOIN陈述式对使用者来说是隐藏的,这简化了存取数据的T-SQL陈述式。举例来说,有两张资料表各命名为Manager和 Employee2,如图18-5所示。



图18-5 Manager和Employee2资料表
使用下面的陈述式将两个数据表联结到一个虚拟的数据表上:
CREATE VIEW org_chart
AS
SELECT Employee2.ename, Manager.mname
FROM Employee2, Manager
WHERE Employee2.manager_id = manager.id
GROUP BY Manager.mname, Employee2.ename
在本范例中,两个数据表透过manager_id值联结。最后的结果依经理的名称分组,显示在org_chart检视表,如图18-6所示。注意,如果在Manager数据表中,某个经理之下所属员工未被列入Employee2数据表,检视表就不会出现该经理的记录项目。如果Employee2数据表中的某个员工,其所属经理未被列在Manager数据表,检视表中也不会有记录项目。对于一般使用者来说,看到的是一份由员工和其所属经理构成的虚拟数据表。



图18-6 org_chart检视表
汇总

汇总(aggregation)检视表可用在很多方面,如检视部门的平均值、总和等等。举例来说,要编制预算,可利用汇总检视表检视公司各部门薪资状况。使用T-SQL查询也可以达成这项任务。使用检视表的优点在于,使用者可简单执行检视,而无须了解汇总及T-SQL的执行与运算细节。
________________________________________
说明
SQL Server汇总函数对一组值进行运算后传回单一值。汇总函数包括AVG、COUNT、MAX、MIN和SUM。
________________________________________
下列的陈述式利用汇总函数(SUM),计算Employee数据表的总和:
CREATE VIEW sal_vw
AS
SELECT dept,
SUM (Salary) AS [SUM(salary)]
FROM Employee
GROUP BY dept
在本例中,检视表建立一个虚拟的数据表,显示各部门的薪资的总合。最后的数据是按部门分类,如图18-7所示。这个汇总检视表是比较简单的。事实上,检视表可以依实际需要执行更复杂的功能。



图18-7 sal_vw检视表
合并分割的数据表

检视表通常也用于合并分割的数据表,使其成为单一的大型虚拟资料表。通常我们会利用分割数据表的方式,减少数据表和索引的大小。要分割数据表,要先建立数个小型数据表来取代原来的大型数据表,然后每个小型数据表再从原大型数据表分配特定范围的值。举例来说,一个公司内部可建立许多小型数据表,每一个小型数据表皆含有该星期的销售记录,若要检视该公司的销售历史记录,就利用检视表合并这几个小型数据表,而无需在一开始就将所有销售记录输入成为一份大型数据表。
图18-8所显示的检视表,在使用者看起来,就像是一份大型数据表内的数据,其实该数据表是数个小型数据表的结合,且每一个数据表都有自己的索引(事实上,丛集的日期索引在这里更适用)。



图18-8 使用检视表合并分割的数据表数据
如之前所述,分割的数据表为DBA建立了更易于管理的系统,而合并分割的数据表则将数据以简化的方式呈现给使用者。
要建立一个合并分割数据的检视表,首先要先建立分割的数据表。这些数据表可能包含了销售数据。每一个数据表会将数据储存一个特定的周期(约一个星期或一个月)。当这些数据表建立完成,可以使用UNION ALL陈述式建立一个包含所有数据的检视表。举例来说,假设有四个数据表,分别命名为table_1、table_2、table_3和table_4,以下的陈述式可用于建立一个包含所有数据的大型虚拟数据表:
CREATE VIEW partview
AS
SELECT * FROM table_1
UNION ALL
SELECT * FROM table_2
UNION ALL
SELECT * FROM table_3
UNION_ALL
SELECT * FROM table_4
现在所有的数据都在同一个数据表(即为检视表)中,并且易于管理。然而如果您建立新分割数据表且删除旧分割数据表,则您就必须重建检视表。
使用Enterprise Manager建立检视表

本节我们会使用Enterprise Manager在Northwind数据库中建立一个检视表,步骤如下:
1. 在Enterprise Manager窗口中,展开 数据库 数据夹,按一下Northwind数据库,如图18-9所示。


图18-9 显示Northwind数据库信息
2. 在Northwind数据库上按右钮以叫出快捷菜单。选择 新增 / 检视表 以进入 新增检视表 窗口,如图18-10所示。利用该窗口定义检视表名称,检视表所使用的数据行,以及底层数据表。
新增检视表 窗口包含下列四个窗格:
o 图表窗格 显示用来建立检视表的数据表数据。数据行可在此窗格中选取。

o 方格窗格 显示从底层数据表中所选择构成检视表的数据行。数据行可在此窗格中选取。



图18-10 新检视表窗口
o SQL窗格 显示用于定义检视表的SQL陈述式。当您在图表窗格中拖曳数据或在方格窗格中选择数据行时,SQL Server就会产生SQL陈述式,可以在SQL窗格中检视刚产生的SQL陈述式。

o 结果窗格 显示从检视表中检索到的数据列,提供数据应显示的状况。

在 新增检视表 窗口的工具列点选相关的图标,可以显示或隐藏某个窗格,工具列上的其它窗格也提供重要的选项,以下我们由左到右解释这些工具列上的其它选项:
o 存档 储存检视表。

o 属性 可更改检视表的属性。按一下这个图标以显示 属性 窗口,在这里可设定 重复数据仅显示一笔 及 加密检视 选项。

o 显示/隐藏窗格 (四个图标) 可选择显示或隐藏 新增检视表 窗口的任意四个窗格。

o 执行 执行及显示在 结果窗格 内的查询,可验证查询是否被正确执行。

o 取消执行并清除结果 清除 结果窗格 。

o 验证SQL 针对底层数据表查询和验证SQL陈述式是否正确。

o 移除筛选 移除已定义的筛选条件。

o 使用 'GROUP BY' 在SQL窗格陈述式中新增GROUP BY子句。

o 加入数据表 可为查询新增数据表。

3. 修改 SQL窗格 中的SELECT陈述式,以符合图18-11所示的S ELECT陈述式。这个检视表由CompanyName、ContactName和Phone资料行构成。输入SELECT陈述式后,按一下 验证SQL 按钮检测查询是否有效。如果检测通过,在接下来的对话框中按一下 确定 ,允许Enterprise Manager将数据填入 图表窗格 和 方格窗格 。 新增检视表 窗口将如图18-11所示。


图18-11 填入数据后的「新增检视表」窗口
4. 利用 结果窗格 ,确认检视表依照预期执行后,关闭 新增检视表 窗口。这时会出现对话框,询问是否要储存检视表。若按一下 确定 ,会提示您为检视表选取名称。请输入一个描述性的名称,按一下 确定 储存以上的操作。
现在检视表可以使用了。您可以利用Enterprise Manager设定新检视表的属性,包括设定权限。在本章后面的 〈检视表的修改与删除〉 一节将仔细介绍检视表属性窗口。
使用建立检视表精灵

请参照下列步骤使用建立检视表精灵:
1. 在Enterprise Manager中,从 工具 菜单中选取 精灵 ,展开 数据库 ,选择 建立检视表精灵 ,然后按一下 确定 ,进入 欢迎使用建立检视表精灵 ,如图18-12所示。
2. 按一下 下一步 显示 选取数据库 窗口,在这里可以选择要建立检视表的数据库,本例中为Northwind数据库。


图18-12 「欢迎使用建立检视表精灵」窗口
3. 按一下 下一步 进入 选取对象 窗口,如图18-13所示。这里可选择检视表所要引用的一个或多个资料表。假设建立的是一个简单的检视表,选择单一数据表即可。假设要联结建立检视表,就选择多个数据表。


图18-13 「选取对象」窗口
4. 按一下 下一步 进入 选取数据行 ,如图18-14所示。这里可以选择检视表中所要用的到数据行,本例中要用到的是CompanyName、ContactName和Phone资料行。


图18-14 「选取数据行」窗口
5. 按一下 下一步 进入 定义限制 窗口,这个窗口可依需要定义WHERE子句,限制检视表所选择的数据列。
6. 按一下 下一步 进入 为检视表命名 ,如图18-15所示。在文字方块中输入检视表的名称。
7. 按一下 下一步 进入 完成建立检视表精灵 窗口,如图18-16所示。在这里可以按一下 完成 储存检视表,或是按一下 上一步 更改设定,也可以按一下 取消 放弃建立检视表。


图18-15 「为检视表命名」窗口



图18-16 「完成建立检视表精灵」窗口
使用检视表秘诀

在建立检视表时,请记住检视表是由存取底层资料的SQL陈述式所构成。遵循以下的使用原则,可以改善数据库的执行效能:
利用检视表提供的安全机制 检视表可让使用者只透过检视表存取数据,无法直接存取检视表的的底层数据表,所以没有必要的数据就不会出现在检视表上。这同时还能增加安全性,因为使用者只能看到检视表中定义的数据,而看不到底层数据表中的数据。当使用者仅允许存取数据表的部分信息时,也无需重新建立新的数据表供此用途,因此也不会增加数据库负担。

善用索引 由于使用检视表时是存取底层数据表的数据,包括数据行的所设定的索引。如果数据表有一个数据行设为索引,请定义检视表的SELECT陈述式中的WHERE子句包括这一个数据行。只有当该数据行是检视表的一部分,且在WHERE子句中使用时,才会利用该索引。举例来说,若在Employee数据表的Dept数据行上建立了索引,而且该数据行包括在检视表中,那么就可以在检视表中使用索引。

将数据进行分割 检视表可用来分割数据。分割数据的好处在于减少花在建立索引的时间,并透过减少独立组件所占用的空间,达到管理虚拟数据表的目的。举例来说,将数据分割成几个小型的数据表后再重建索引,比起在一个大型数据表重建索引所需的时间还要来得短。所以可以以定义检视表的方式,清楚地将每个数据表合并成一个大型数据表,这个方法对于储存历史数据的大型数据表尤其实用。

检视表的修改与删除

利用Enterprise Manager或T-SQL命令可修改检视表。使用Enterprise Manager较为简单,但使用T-SQL命令的好处在于建立一次命令后可以重复使用。两种方法都会在本节中示范。
使用Enterprise Manager修改或删除检视表

请参照以下步骤修改或删除检视表:
1. 在Enterprise Manager中,在选定的服务器中展开 数据库 数据夹。展开检视表所在的数据库后,按一下 检视表 图示以在右方窗格中显示所有的检视表,如图18-17所示。


图18-17 点选检视表后的Enterprise Manager窗口
2. 在欲修改或删除的检视表名称后按右钮,会出现快捷菜单,如图18-18所示,选择 删除 即可删除该检视表。如要修改检视表,则选择 设计检视 。


图18-18 检视表的快捷菜单
3. 如果选择的是 删除 ,会进入 卸除对象 对话框,如图18-19所示。按一下 显示依存的情况 按钮,即可看到检视表的底层架构,并可看到检视表和资料表的相依性。如果选取的检视表是属于联结(JOIN)或是联合(UNION)检视表,所有相关的数据表都会在这里显示;如果选择的检视表是数据行或数据列检视表,在这里就只会看到一个资料表。当确定要删除该检视表,按一下 卸除全部 即可执行删除工作。


图18-19 「卸除对象」对话框
如果选择的是 设计检视 ,会出现如图18-20的 设计检视表 对话框。这个对话框和在之前图18-10所看到的 新增检视表 窗口类似,利用这个对话框修改检视表的方式就如同之前建立检视表的方法一样。



图18-20 「设计检视表」对话框
4. 修改完成后,按一下 关闭 按钮结束窗口,系统会提示您储存已修改的检视表。
当修改完成,可以设定检视表的权限。先开启检视表属性窗口(在Enterprise Manager中点选检视表名称后按右钮,在快捷菜单中选择 内容 ),然后按一下 权限 进入权限窗口修改检视表权限,详细的设定方式会在本书 第34章 介绍。
如您所视,使用Enterprise Manager修改检视表非常容易,但是,如果所要修改或删除的检视表是较为大型的检视表,使用T-SQL会较为方便,因为使用T-SQL可以将T-SQL陈述式储存为指令码。
使用T-SQL修改与删除检视表

利用ALTER VIEW命令可以修改检视表。ALTER VIEW命令和CREATE VIEW命令的使用方法类似,语法如下:
ALTER VIEW view_name [(column, column, ...)]
[WITH ENCRYPTION]
AS
your SELECT statement
[WITH CHECK OPTION]
ALTER VIEW命令和CREATE VIEW命令之间的区别是,如果检视表已经存在,CREATE VIEW命令无法执行;如果指定的检视表不存在,ALTER VIEW命令无法执行。(WITH ENCRYPTION和WITH CHECK OPTION这两个关键词可选择性的使用,方法在本章之前的 〈使用T-SQL建立检视表〉 一节已介绍过。)
现在让我们回到之前合并分割的数据表范例,实际执行ALTER VIEW命令(回到本章之前 〈合并分割的数据表〉 一节)。我们会在删除分割后再新增分割,示范如何使用ALTER VIEW命令:
ALTER VIEW partview
AS
SELECT * FROM table_2
UNION ALL
SELECT * FROM table_3
UNION ALL
SELECT * FROM table_4
UNION ALL
SELECT * FROM table_5
修改过后的检视表看起来和执行ALTER VIEW命令之前的检视表相同,但其实已使用ALTER VIEW选择了不同的数据集。现在检视表引用的是table_5的数据,不再使用table_1的数据。
若要删除检视表,可使用DROP VIEW命令,语法如下:
DROP VIEW view_name
SQL Server 2000中检视表的增强功能

SQL Server 2000在检视表方面有两项改良:可更新的分布式分割检视表;以及检视表中可以建立索引。以下就来看看这两项强化功能。
可更新的分布式分割检视表

在SQL Server 7以及较早的版本,检视表所呈现的数据为底层数据表的实际状态,属于静态数据。但在SQL Server 2000,更新分割检视表的同时会更新检视表及底层数据表。另外,分割检视表可以横跨多个SQL Server 2000系统。分割检视表可以用于建立数据库服务器联盟。 联盟 (Federation)是独立管理,但是却协同运作来分散系统处理负载的服务器群组。藉由分割数据来形成数据库服务器联盟,让您可以扩充系统。数据库服务器联盟可支持大型的电子商务Web网站或是企业型的数据库系统。图18-21为一个数据库服务器联盟的设定范例。



图18-21 SQL Server系统联盟
在您建置分割检视表前,必须先将数据表水平分割。原始资料表会被数个较小型的成员资料表所取代,每一个成员数据表与原始数据表具有相同数量的数据行,并且每一个数据行与原始数据表中的对应数据行具有相同的属性(例如数据型别、大小、定序)。如果建立的是分布式的数据分割检视表,每一个成员数据表便位于个别的成员服务器上。为了可以轻易的识别成员数据表的位置,成员数据库的成员数据表在每一个成员服务器上的名称应该相同,虽然这并不是必要条件,但可以方便系统管理。
当您设计了成员数据表之后,让每一个数据表依照某一数据范围(水平切割)来储存原始数据。每一个成员数据表中值的范围是由分割数据行的CHECK条件约束强制限定,并且范围不得重迭。现在就来看一个水平分割的范例。本范例中我们将Customer数据表分割成四个数据表,这三个数据表会放在不同的服务器中,每个服务器上包含3000笔Customer数据表的记录。约束条件包含在以下的CREATE TABLE陈述式内:
Server 1:
CREATE TABLE Customer_Table_1
(CustomerID INTEGER PRIMARY KEY
CHECK (CustomerID BETWEEN 1 AND 3000),
.
. (Additional column definitions)
.
-- 在Server 2:
CREATE TABLE Customer_Table_2
(CustomerID INTEGER PRIMARY KEY
CHECK (CustomerID BETWEEN 3001 AND 6000),
.
. (Additional column definitions)
.

-- 在Server 3:
CREATE TABLE Customer_Table_3
(CustomerID INTEGER PRIMARY KEY
CHECK (CustomerID BETWEEN 6001 AND 9000),
.
. (Additional column definitions)
.

-- 在Server 4:
CREATE TABLE Customer_Table_4
(CustomerID INTEGER PRIMARY KEY
CHECK (CustomerID BETWEEN 9001 AND 12000),
.
. (Additional column definitions)
.
建立成员数据表之后,在每个成员服务器上定义一个分布式的分割检视表。所有的检视表应具有相同的名称以方便应用程序的撰写,分布式分割检视表使得执行于任何成员服务器上的查询就好像所参考的数据位于本机一样。换句话说,如果在成员服务器上所执行的查询引用的是在其它成员服务器上的数据,数据仍然立即传回,就像位于本机一样。
为了达成数据在各个成员服务器之间透通的目的,必须在每一个成员服务器上新增连结服务器定义,提供联盟中各成员服务器所需的联机信息,使分布式的分割检视表可以存取其它服务器上的数据。您可以使用Enterprise Manager或T-SQL命令建立连结服务器定义。
使用T-SQL设定连结服务器

以下为使用T-SQL命令建立连结服务器定义的语法:
sp_addlinkedserver [@server = ] 'server'
[,[@srvproduct = ] 'product_name']
[,[@provider = ] 'provider_name']
[,[@datasrc = ] 'data_source']
[,[@location =] 'location']
[,[@provstr = ] 'provider_string']
[,[@catalog = ] 'catalog']
sp_addlinkedserver这个预存程序可包含下列自变量:
@server 连结服务器名称。若SQL Server具有多重执行个体,就必须将名称设为这样的型式server_name/instance_name。

@srvproduct OLE DB Provider的产品名称。如果SQL Server 2000系统是连结到另一个SQL Server 2000系统上,则不必指定 @srvproduct。

@provider 之前在 @srvproduct中所指定的OLE DB Provider之唯一程序化识别码。如果是两个SQL Server 2000系统作连结,则不必指定 @provider。

@datasrc 是指由OLE DB Provider所解译的资料来源名称。如果是两个SQL Server 2000作连结,则不必指定 @datasrc,但若是要连结到该连结服务器特定的执行个体,则还是要指定 @datasrc,设定的形式为 server_name/instance_name。

@location 是指由OLE DB Provider所解译的数据库位置。如果是两个SQL Server 2000系统作连结,则不必指定 @location。

@provstr 特定OLE DB Provider的特定连接字符串。如果是两个SQL Server 2000系统作连结,则不必指定 @provstr。

@catalog 是指联机至OLE DB Provider时所使用的数据库目录。

举例来说,以下的T-SQL命令会建立连结服务器定义,使四台服务器-1、2、3和4之间可以互相沟通。
Server 1 :
sp_addlinkedserver 'Server2'
sp_setnetname 'Server2','sql-server-02'
sp_addlinkedserverlogin SServer2, 'false','sa','sa'
sp_addlinkedserver 'Server3'
sp_setnetname 'Server3', 'sql-server-03'
sp_addlinkedserverlogin SServer3, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server4'
sp_setnetname 'Server4', 'sql-server-04'
sp_addlinkedserverlogin SServer4, 'false', 'sa', 'sa'
Server 2 :
sp_addlinkedserver 'Server1'
sp_setnetname 'Server1', 'sql-server-01'
sp_addlinkedserverlogin SServer1, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server3'
sp_setnetname 'Server3', 'sql-server-03'
sp_addlinkedserverlogin SServer3, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server4'
sp_setnetname 'Server4', 'sql-server-04'
sp_addlinkedserverlogin SServer4, 'false', 'sa', 'sa'
Server 3 :
sp_addlinkedserver 'Server1'
sp_setnetname 'Server1', 'sql-server-01'
sp_addlinkedserverlogin Server1, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server2'
sp_setnetname 'Server2', 'sql-server-02'
sp_addlinkedserverlogin Server2, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server4'
sp_setnetname 'Server4', 'sql-server-04'
sp_addlinkedserverlogin SServer4, 'false', 'sa', 'sa'
Server 4 :
sp_addlinkedserver 'Server1'
sp_setnetname 'Server1', 'sql-server-01'
sp_addlinkedserverlogin SServer1, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server2'
sp_setnetname 'Server2', 'sql-server-02'
sp_addlinkedserverlogin SServer2, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server3'
sp_setnetname 'Server3', 'sql-server-03'
sp_addlinkedserverlogin SServer3, 'false', 'sa', 'sa'
除了使用sp_addlinkedserver之外,我们还使用了其它两个陈述式,一个为 sp_setnetname;另一个为sp_addlinkedsrvlogin。这两个陈述式可辅助分布式分割检视表的处理。透过呼叫sp_setnetname陈述式可以将在某SQL Server中的连结服务器名称和该SQL Server的网络名称作连结。在之前的范例中,连结服务器名称为Server 2的就是在网络上名称为sql-server-02的服务器中,并指定登入到连结服务器上所需的信息。透过呼叫sp_addlinkedsrvlogin陈述式可指定SQL Server在存取连结服务器时的使用者身份和密码。
使用Enterprise Manager连结服务器

利用以下的步骤可透过Enterprise Manager连结服务器:
1. 在Enterprise Manager中,在服务器中展开 安全性 数据夹,如图18-22所示。


图18-22 展开服务器后的「安全性」数据夹
2. 在左方窗格中的 连结服务器 图示上按右钮叫出快捷菜单。选择 新增连结服务器 进入 连结服务器属性 窗口,如图18-23所示。


图18-23 「连结服务器属性」的「一般」标签页
3. 在 连结的服务器 的文字方块中,输入想要连结的服务器名称,在 服务器类型 中按一下 SQL Server ,如图18-24所示。
4. 按一下 安全性 标签页。输入 本机登入 名称,选取 模拟 或是输入 远程使用者 和 远程密码 。图18-25显示输入本机登入名称后的窗口。
5. 按一下 确定 完成连结服务器定义的设定。
设定完成后就可使用连结服务器,利用Enterprise Manager修改或删除连结服务器的属性。此外,也可以利用Enterprise Manager检视在连结服务器上的数据表和检视表。



图18-24 选择连结服务器类型



图18-25 连结服务器窗口的安全性页签
建立检视表

在完成所有连结服务器定义后,可以建立实际的检视表。以下的范例会带您建立一个名称为sales的检视表,且该检视表结合了其它四个服务器上的sales数据表。
CREATE VIEW sales
AS
SELECT * FROM Server1.bicycle.dbo.sales
UNION ALL
SELECT * FROM Server2.bicycle.dbo.sales
UNION ALL
SELECT * FROM Server3.bicycle.dbo.sales
UNION ALL
SELECT * FROM Server4.bicycle.dbo.sales
GO
索引检视表

SQL Server 2000允许您在检视表上建立索引。由于检视表其实是一个虚拟数据表,所以它的外观和实际的数据表没什么不同。在检视表上建立索引的T-SQL陈述式跟建立数据表索引的一样,也就是CREATE INDEX陈述式(在本书 第17章 有介绍)。当然,在设定数据表时我们所输入的是数据表的名称,但在设定检视表的时候就要输入检视表的名称,这是唯一不同的地方。现在,我们就利用T-SQL命令,在名称为partview的检视表上建立丛集索引:
CREATE UNIQUE CLUSTERED INDEX partview_cluidx
ON partview (part_num ASC)
WITH FILLFACTOR=95
ON partfilegroup
在检视表上建立索引对系统的执行效能有几个影响。最明显当然是改善在检视表上存取数据时的执行效能,这和之前所提到索引可以改善数据表的执行效能的逻辑是一样的。
此外,在检视表中建立索引后,SQL Server会在内存中储存检视表传回的结果集,当日后查询时就不必再将检视表具体化。所谓 具体化 (materializing)指的是每一次当执行查询需要引用检视表时,SQL Server就需要动态合并一个检视表结果集所需数据的处理程序。(请记住检视表是一个动态的结构)。这个将检视表具体化的过程其实是会造成系统负担的。尤其对一个复杂的检视表或含有大量数据的检视表而言,必须重复的将检视表具体化更是影响执行效能。
对检视表建立索引的另一个好处是,即使查询的FROM子 句中未直接使用检视表的名称,但SQL Server查询最佳化器(Query Optimizer)会开始在查询中使用检视表索引。换言之,不必重新改写现有的查询,就可以从索引的检视表中撷取数据以提升效能。
当然,使用索引检视表改善系统执行效能也不是只有好处没有坏处,如索引检视表的维护对SQL Server来说就较为复杂。每一次修改检视表的底层数据表时,SQL Server就必须更新检视表结果集和检视表中的索引。由于一个检视表的索引范围可能比单一数据表上的索引还要复杂(例如当检视表包含数个大型数据表的数据时),使用索引检视表查询的优势可能远比花在维护检视表和索引还来的少!基于维护方面的考虑,使用索引检视表前必须考虑这样的设定是否真的达到我们想要改善执行效能的目的。通常,当底层数据表的数据为静态数据时、当查询的结果集会运用到大量数据列,或是大部分的查询都会引用到底层数据表时,我们才考虑使用索引检视表。
本章总结

本章中学习到利用检视表建立虚拟数据表,检视表为辅助型的数据结构,虽然外观和数据表相同,但检视表储存的其实是SQL查询。这些查询和其它查询联结,存取底层数据表的数据。
在T-SQL陈述式中引用检视表的方式和引用数据表相同。检视表也能用于设定安全性层级,保护机密的数据,提供更简单的方法存取数据。另外,检视表让数据的呈现具逻辑性,也可将分割的数据表以检视表的方式建立单一的虚拟数据表。
本章中,我们也学习到使用检视表的限制和原则,并适时的使用索引检视表。在 19章 中,我们将学习交易和交易锁定。