将 Access 2002 数据库迁移到 SQL Server

Adam Cogan
Microsoft 澳大利亚区域总监

适用范围:
Microsoft Access 2002
Microsoft SQL Server 2000 Service Pack 3a (SP3a)

**摘要:**参考本文介绍的功能比较,为将 Access 2002 数据库后端系统迁移到 SQL Server 2000 做好准备。

本页内容

前提条件 前提条件
引言 引言
SQL Server 工具 SQL Server 工具
体系结构 体系结构
可伸缩性和性能 可伸缩性和性能
使用数据 使用数据
结论 结论
术语 术语

前提条件

本文中进行的所有比较均假定使用了以下软件:

  • Microsoft Access 2002 或更高版本

  • Microsoft SQL Server 2000 Standard Edition 或 Enterprise Edition

还假设您的数据当前存储在 Access 数据库 (.mdb) 文件中,而不是在 SQL Server 上,而且您没有使用支持本文中介绍的许多 SQL Server 功能的 Access 数据项目 (ADP)。

本文的目标读者

本文的目标读者是熟悉 Access 功能,且正在考虑将后端基础结构(数据和查询)迁移到 Microsoft SQL Server 的 Access 开发人员、Microsoft Visual Basic 开发人员和 .NET 开发人员。

读者需要熟悉以下 Access 功能:

  • 基本 SQL

  • 以多种格式导入和导出数据

  • 备份和恢复数据

  • 实现安全性

本文通过比较 Access 和 SQL Server 的功能,希望能对新的 SQL Server 开发人员有所帮助。

引言

Microsoft Access 开发人员通常由于性能、安全性和稳定性因素而考虑迁移到 SQL Server,此过程称为升级 (upsizing)。在从 Access 迁移到 SQL Server 时,开发人员会发现几点主要的差异。关键是要注意到这些差异并采取相应的措施,确保从 Access 无缝且无错误地迁移到 SQL Server。

Microsoft SQL Server 是一个企业级数据管理系统。它集成了行业标准的安全性、可伸缩性和可管理性。此外,它还支持可扩展标记语言 (XML) 和 Internet 查询。

**提示:**这里不讨论从 Access 迁移到 SQL Server 的过程。 有关迁移的详细信息,请参阅 Migrating Your Access Database to Microsoft SQL Server 7.0。(注意:这篇文章是针对 SQL Server 7.0 编写的,尚未进行更新。)

**提示:**这里不讨论数据复制和数据库安全性之间的差异。
有关在 SQL Server 中实现复制的详细信息,请参阅 SQL Server 2000 SDK 文档中的 Implementing Replication
有关 SQL Server 安全性的详细信息,请参阅 SQL Server 2000 SDK 文档中的 Managing Security Accounts

SQL Server 工具

使用 Access 数据库窗口中的主菜单,您可以创建查询、设计数据库或浏览数据。要从数据库中导出数据,请单击 File(文件),然后单击 Export(导出)。要将数据导入到数据库中,请单击 File(文件)-> Get External Data(获取外部数据),然后单击 Import(导入)。

SQL Server 提供了一套功能强大的工具,它们简化了浏览、查询、导入和导出数据的过程。它们是:

  • SQL Server 企业管理器

  • SQL Server 查询分析器

  • 数据转换服务

  • SQL Server 事件探查器

用于设计数据库和查询以及浏览数据的 SQL Server 工具

在 SQL Server 中,您可以使用两个工具来执行数据库维护任务、浏览和编辑数据。这两个工具分别是 SQL Server 企业管理器和 SQL Server 查询分析器。计划将窗体迁移到 .NET 的 Access 窗体开发人员还会发现 Microsoft Visual Studio .NET 非常有用,因为它提供了一种集成的方法,使您可以在一个开发环境中创建和管理 SQL Server 数据库和数据访问窗体。

SQL Server 企业管理器

SQL Server 企业管理器是与 SQL Server 捆绑安装的应用程序,用于设计和管理数据库(如图 1 所示)以及浏览数据(如图 2 所示)。企业管理器还提供以下功能:

  • 管理表/字段/数据、表关系、存储过程、视图、触发器、函数和用户定义的数据类型。

  • 创建数据库关系图

  • 创建数据库备份和恢复数据

  • 管理数据库登录和对象权限

  • 以使用数据转换服务 (DTS) 的多种格式导入和导出数据

1 SQL Server 企业管理器在设计和管理数据库方面可以代替 Access 主对话框。

2 :使用企业管理器可以像在 Access 中一样浏览和编辑数据。

SQL Server 查询分析器

SQL Server 查询分析器是一个完善的图形查询工具,可以代替 Access 主查询设计器。您可以通过它完成以下操作:

  • 创建和调试查询

  • 运行多个同步查询

  • 查看数据

  • 导出数据(单击 Query [查询],然后单击 Results to File [将结果保存到文件])

  • 优化查询(单击 Query [查询],然后单击 Show Execution Plan [显示执行方案])

  • 调试高级查询(单击 Tools [工具] -> Object Browser [对象浏览器],然后单击 Debug [调试])

    **提示:**查询分析器不仅支持上述功能,还可以突出显示语法,使您可以很容易地查看和调试查询(如图 3 所示)。尽管可以在企业管理器中编写存储过程(如所图 4 示),但 Access 开发人员会发现查询分析器的功能更丰富。

    3 :查询分析器可以代替 Access 查询设计器,还增加了诸如突出显示语法和查询调试等功能。

    4 :在企业管理器中编写高级存储过程没有在查询分析器中容易

Access 中“使用向导创建查询”的功能在 SQL Server 中没有对应的功能。必须使用查询设计器或 SQL Server 语句来创建查询。

Visual Studio .NET

使用 Visual Studio .NET,您可以像在企业管理器中一样管理数据库和数据库对象,如图 5 所示。根据您使用的 Visual Studio .NET 版本,您可以创建允许您执行以下操作的数据库项目:

  • 设计和执行存储过程、视图、触发器和函数

  • 浏览表

  • 查看数据

此功能对 .NET 开发人员很有用,因为它提供了一种集成的数据库管理方法。开发人员可以在一个应用程序中开发应用程序并管理数据库。

5 Visual Studio .NET 提供了一种集成的数据管理方法

有关哪些版本的 Visual Studio .NET 支持哪些数据库管理功能的详细信息,请参阅 Visual Database Tools Editions

用于导入和导出数据的 SQL Server 工具

数据转换服务

数据转换服务 (DTS) 允许您在使用基于 OLE DB 体系结构的多种数据源(例如 Microsoft Excel)中导入和导出数据。DTS 不仅可以代替 Access 的导入和导出功能(如图 7 所示),还提供了以下功能:

  • 在 SQL Server 数据库中导入和导出数据

  • 以多种格式导入和导出数据,这些格式包括 Excel(.xls 文件)、逗号分隔值(.csv 文件)和 Microsoft Access,请参阅图 6。

  • 执行数据转换

6 :使用 DTS 以多种数据格式导入和导出数据。

DTS 的功能比 Access 中的导入和导出命令更强大。在 Access 导入过程中需要执行多个步骤才能完成的许多任务(例如,要执行数据转换,需要填充临时表并运行多个查询)在 DTS 中只需一个步骤即可完成。可以执行数据转换,例如,使用 SQL 查询将数据从一个表复制到另一个表中,或在插入目标表之前执行 VBScript 代码以转换部分数据,如图 8 所示。

7 DTS 可以代替 Access 导入和导出向导,还可以进行高效的数据转换。

8 DTS 可以执行高效的数据转换,而 Access 则需要更长的时间才能完成同样的操作。

SQL Server 事件探查器

SQL Server 事件探查器是优化数据库性能的重要工具。该工具非常有用,尤其是从只适用于客户端的系统(例如 Access)迁移之后。它可以显示服务器上执行的所有命令(例如,已打开和关闭连接)和数据库事务,如图 9 所示,这可以帮助您识别特别耗时或耗费资源的事务。

9 SQL Server 事件探查器可以监视数据库活动,从而帮助您优化性能。

有关使用这些 SQL Server 工具的详细信息,请参阅 Migrating Your Access Database to Microsoft SQL Server 7.0。(注意:这篇文章是针对 SQL Server 7.0 编写的,尚未进行更新。)

体系结构

Access 体系结构与 SQL Server 体系结构相比有几个不同点、相似点和缺点。它们的不同点体现在以下几个方面:

  • 数据访问模型

  • 表设计

  • 关系

  • 索引

  • 数据查询类型

  • SQL Server 还为优化和简化数据处理提供了强大的功能,包括:

  • 触发器

  • 临时表

  • 用户定义的函数

系统要求

最低系统要求

由于 SQL Server 比 Access 具有更丰富的功能和更好的可缩放性,因此它对系统的要求要略高一点。表 1 对这两个系统的最低系统要求进行了比较。

表 1:SQL Server 和 Access 的最低系统要求

Access

SQL Server

处理器

Pentium 75 MHz

Pentium 166 MHz

内存

8 MB,每个同时运行的应用程序需增加 4 MB,运行 Microsoft Windows XP 需增加 128 MB

128 MB RAM 或更多

硬盘空间

30 MB

270 MB(完全安装)

操作系统

Microsoft Windows Server 2003、Windows XP、Windows 2000、Windows NT 4.0 Service Pack 6 (SP6)、Windows Millennium Edition、Windows 98 Second Edition、Windows 98 或 Windows 95

Microsoft Windows Server 2003、Windows XP、Windows 2000、Windows NT 4.0、Windows 98 Second Edition、Windows 98、Windows 95 或 Windows CE

实际系统要求

表 1 列出的最低要求在典型的操作环境中是不现实的。系统要求主要取决于数据量和并发用户的数量。

如果有 10 个并发用户和一个 1 GB 的数据库,建议使用表 2 中指定的系统在生产环境中运行 Access 或 SQL Server。

表 2:建议的 SQL Server 和 Access 系统要求

建议使用

处理器

Pentium III 650 MHz

内存

384 MB

硬盘空间

2 GB

操作系统

Microsoft Windows Server 2003 或 Windows 2000

SQL Server 版本

SQL Server 2000 有六个版本:

  • Enterprise Edition

  • Standard Edition

  • Personal Edition

  • Developer Edition

  • Desktop Engine MSDE)

  • SQL Server CE(与 Windows CE 兼容的版本)

表 3 显示了不同 SQL Server 版本的操作系统要求。

表 3:不同 SQL Server 版本的操作系统要求

操作系统

Enterprise Edition

Standard Edition

Personal Edition

Developer Edition

Desktop Engine (MSDE)

SQL Server CE

Windows Server 2003 Standard Edition

Windows Server 2003 Enterprise Edition

Windows Server 2003 Datacenter Edition

Windows XP Professional

Windows CE

Windows 9x

引擎实现

Access 中的 Jet 数据库引擎与 SQL Server 的不同之处在于,它不能像 SQL Server 那样作为一项服务持续运行,而是在用户每次使用 Access 或其他某些数据访问方法打开 Jet 数据库文件(.mdb 文件)时启动。当用户关闭 .mdb 文件并且不再使用该文件时,Jet 引擎将从内存中卸载。

主要区别在于,如果用户当前没有访问 .mdb 文件,则可以使用 Windows 将该文件复制或移动到其他位置。在 SQL Server 中,SQL Server 服务是持续运行的,而且连接到在其中注册的 SQL Server 数据库文件(.mdf 文件)。要复制 .mdf 文件,必须先停止 SQL Server 服务,或者将 .mdf 文件与当前的 SQL Server 服务拆离,然后才能移动它。

数据访问模型

Access 是只适用于客户端的关系型数据库管理系统 (RDBMS)。这意味着所有数据处理(例如排序和筛选)都是在一台计算机上完成的。

Access 开发人员通常通过拆分数据库来模拟客户端/服务器方法。通常,在多个并发用户使用 Access 的环境中,将在每台客户端计算机上设置一个 Access 数据库。此数据库包含窗体、报表、保存的查询和 Microsoft Visual Basic for Applications (VBA) 窗体代码。所有数据都存储在中央服务器的 Access 数据库中,而在请求时才发送给客户端计算机。此方案需要大量网络资源和客户端资源。图 10 显示了这种结构。

10 :拆分 Access 数据库(红色表示负载)

在此方案中,服务器上不执行任何数据处理。当客户端请求数据时,将把整个数据集通过网络发送给客户端,任何处理都是在客户端计算机上完成的。

例如,一家财务公司的数据库中有一个 Accounts Receivable 表(Access .mdb 文件),其中存储了一百万条记录。某个 Access 应用程序要显示应收帐款的总和(一个计算的字段)。要完成此操作,Access 必须通过网络传输整个表,而在工作站上执行计算。

这将为服务器和网络带来严重的性能问题。多次请求大量数据将占用大量服务器资源,而通过网络连接传输整个数据集将大大降低网络速度。

相反,SQL Server 是一个纯客户端/服务器 RDBMS。这意味着客户端和服务器可以共同分担处理负载。客户端(例如 .NET Windows 应用程序)使用参数发送数据请求,服务器执行排序和筛选操作,然后只将经过筛选的数据集返回客户端。图 11 显示了这种结构。

11 SQL Server 可以将处理任务分散到客户端和服务器上,有助于减少网络通信量和服务器负载。

因为 SQL Server 在服务器上处理所有的筛选和排序操作,所以只返回指定的结果集。这有助于大大减少网络通信量,因为在客户端和服务器之间传输的数据比较少。这还有助于减少服务器的处理负载,因为服务器不需要像在 Access 中那样返回大量记录。

数据类型

Access 数据类型和 SQL Server 数据类型之间有几点不同之处。这些数据类型中的大多数会在升级时自动转换,但升级之后,您需要在 SQL Server 数据库中进行验证,这一点很重要。表 4 显示了 Access 数据类型和 SQL Server 数据类型之间的不同之处。请注意,还有某些不受支持的数据类型。

表 4:比较 Access 数据类型和 SQL Server 数据类型

Jet (Access)

SQL Server

Text

char、nchar、varchar、nvarchar

Memo

text、ntext

Byte

tinyint

Integer

smallint

Long Integer

integer

Single

real

Double

float

Replication ID

uniqueidentifier

Decimal

decimal

Date/Time

smalldatetime、datetime、timestamp

Currency

smallmoney、money

AutoNumber

int + 标识属性

Yes/No

bit

OLE 对象

image

Hyperlink

<无对应项>

<无对应项>

binary、varbinary

**提示:**在 Access 中,只要用户开始编辑新记录,系统就会自动生成自动编号的列。在 SQL Server 中,只有在保存记录时才会生成自动编号的列。在 Access 中重新设计基于自动编号值的现有逻辑时,一定要谨慎。

用户定义的数据类型

SQL Server 允许用户定义自定义数据类型,称为用户定义的数据类型 (UDDT)。UDDT 基于现有的 SQL Server 数据类型。还可以直接为类型添加约束,以执行以下操作:

  • 指定默认值。(默认值是指没有为记录指定值时,由系统自动在字段中输入的值。)

  • 设置最大字段大小。

  • 设置字段是否可以为空。

在表中指定其属性将来有可能发生变化的字段时,UDDT 将非常有用。例如,如果您为基本 SQL Server 数据类型 varchar(15)(长度为 15 个字符的字符串)定义了一个唯一标识符字段,然后定义了可以接受 varchar(15) 参数类型的所有相关的存储过程,那么,更改该字段的长度或数据类型将成为一个棘手的维护问题。要反映数据类型的变化,必须更改所有存储过程和表。

更好的做法是创建一个名为 CodeType 的 UDDT,而在 UDDT 中定义长度和基本数据类型。所有存储过程和表定义都使用该 UDDT,所以,如果字段大小增加,只需更改 UDDT 的定义。

UDDT 是通过企业管理器定义的,如图 12 所示。

12 :指定在 SQL Server 数据库对象中使用的 UDDT

表设计

表的表示方式在 Access 和 SQL Server 中是相似的。这两个数据库管理系统 (DBMS) 都是关系型的,也就是说,相关数据都存储在通过唯一标识符链接的逻辑表中。表的设计界面在 Access 和 SQL Server 中也是相似的,如图 13 所示。

13 Access SQL Server 中相似的表设计

关系

在 Access 中,可以为表中的字段指定规则,这样,当一个表中的值发生变化时,相关表中的值将自动更新(级联更新)。

在 SQL Server 中,可以通过企业管理器中的关系图设计器创建相同的规则(如图 14 所示)。SQL Server 支持五类约束:

  • NOT NULL **。**指定列不能包含空值。

  • CHECK **。**限制列中可以输入的值。下列代码将创建一个 Employee 表,并为 Salary 字段添加 CHECK 约束,使该字段的值在 10,000 和 1,000,000 之间。

CREATE TABLE Employee ( EmployeeID int PRIMARY KEY, Name char(50), Address char(50), Salary money, CONSTRAINT chk_Salary CHECK (Salary BETWEEN 10000 and 1000000) )

  • UNIQUE **。**确保表列中的所有值都是唯一的。此约束通常用于 ID 列。

  • PRIMARY KEY **。**标识一列或一个列集合,其值唯一标识表中的某个行。

  • FOREIGN KEY **。**设置表之间的关系。下列代码将创建一个 EmployeePosition 表,该表引用上面创建的 Employee 表中的 EmployeeID。

CREATE TABLE EmployeePosition ( EmployeePositionID int PRIMARY KEY, EmployeeID int FOREIGN KEY REFERENCES Employee(EmployeeID) ON DELETE CASCADE Position char(50) )

![](images/Aa902657.backendsql_14(zh-cn,SQL.80).gif)

**图** **14** **:** **SQL Server** **支持与** **Access** **相似的关系**

ON DELETE 子句有两个选项:

  • CASCADE **。**指定如果从 Employee 表删除某个雇员的记录,还将删除 EmployeePosition 表中具有相同 EmployeeID 的任何记录。

  • NO ACTION **。**指定如果删除 EmployeePosition 记录在 Employee 表中引用的父记录,EmployeePosition 记录将不受影响。

SQL Server 还支持 ON UPDATE 子句,该子句指定父记录更新时要执行的操作。它还支持 CASCADE 和 NO ACTION 选项。

请注意,SQL Server 中的关系没有 Access 中的关系灵活。在 Access 中,您可以:

  • 在表中进行级联、更新或删除更新。

  • 对表中 Required 属性设置为 Yes 的外键进行级联、更新或删除更新。

尽管 SQL Server 不支持这两个选项,但这样可以创建更可靠的数据库,不容易出现关系和键问题。

不支持级联更新循环引用

与 Access 不同的是,SQL Server 不能保证循环引用的完整性。例如,某公司的销售部门有一个高级雇员。在数据库中,该雇员的 EmployeeType 为 Senior,Category 为 Sales。但在数据库中,EmployeeType Senior 在 Sales Category 中。如图 15 所示,允许这种情况的数据库结构将创建循环引用,而 SQL Server 不允许这样做。如果您尝试创建循环更新约束,将看到类似以下内容的错误消息:

Unable to create relationship 'FK_EmployeeType_Employee'.  
ODBC error:[Microsoft][ODBC SQL Server Driver][SQL Server]Introducing 
FOREIGN KEY constraint 'FK_EmployeeType_Employee' on table 'EmployeeType' 
may cause cycles or multiple cascade paths.Specify ON DELETE NO ACTION or 
ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
[Microsoft][ODBC SQL Server Driver][SQL Server]Could not create 
constraint.See previous errors.

这是因为,如果更新任何表中的一个字段,都可能导致无限循环。在本例中,更新一个 CategoryID 字段将导致下一个 CategoryID 字段更新(由于级联更新引用完整性),而这又会导致下一个 CategoryID 字段更新,如此循环下去。

15 :循环级联更新约束在 SQL Server 中产生错误。

要在 SQL Server 中解决此问题,需要从表中删除引用完整性约束,并在每个表中创建一个触发器以执行更新。有关使用触发器的详细信息,请参阅 Enforcing Business Rules with Triggers

对索引的改进

在 Access 中,可以为表中的一个或多个字段建立索引,称为组合键。

SQL Server 可以按照相同的方式处理索引。建立索引后的表实际上在硬盘上进行排序,并按照排序顺序进行存储。这称为群集。群集是指 SQL Server 基于群集索引在硬盘上排序和存储数据。如果某个字段已建立索引但没有建立群集,SQL Server 必须首先查询索引才能找到数据,这将降低性能。

例如,Employees 表中可以有一个唯一标识符,称为 EmployeeID。但是,此表主要基于 FirstName 来字段完成搜索。通过为 EmployeeID 字段定义索引并将其 clustered 属性设置为 true,可以优化对 FirstName 列的数据访问(如图 16 所示)。因为它已建立群集,所以按照排序顺序以物理方式存储在硬盘上,使数据访问更有效。

16 :在 SQL Server 中设置使用群集的表索引以提高性能

Access 查询与 SQL Server 视图

SQL Server 视图类似于 Access 查询,如图 17 和图 18 所示。它们都允许您指定一个经过筛选的数据集,其中的数据可能是从多个表和其他视图中整理出来的。

视图对处理安全问题很有用。例如,如果您想允许一组用户查看产品订单的信息,但不允许他们查看与付款链接的信用卡详细信息,那么您可以:

  1. 创建一个视图,只检索订单表中的非敏感性字段。

  2. 拒绝该组用户访问订单表。

  3. 允许该组用户访问视图。

    17 Access 查询

    18 SQL Server 视图

与查询不同的是,视图还可以利用索引,这样可以大大提高应用程序的性能,而查询则需要频繁地执行某些联接或聚合操作。在一个已建立索引的视图中,可以为其他视图创建索引,而该视图的结果集存储在数据库中,并在数据库中进行索引。

Access 查询与 SQL Server 存储过程

SQL Server 使用存储过程来查询数据,执行数据计算。存储过程的主要优点是它们在第一次运行时即被编译。这意味着 SQL Server 可以计算出执行存储过程的最佳方式,并将该执行方案存储在内存中。以后再执行存储过程将会非常快,因为 SQL Server 已经找到运行查询的最佳路径。

存储过程是在 SQL Server 企业管理器中创建和修改的,这非常类似于在 Access 中编辑 Access 查询(参阅图 19)。存储过程与 Access 查询的相似之处在于它们都接受输入参数。

19 :用于查询数据和执行数据计算的存储过程

由于存储过程是使用 T-SQL 编写的,因此它们要优于 Access 查询,因为可以使用条件逻辑和计算来修改或返回数据或执行其他某些函数,如图 20 所示。

20 :使用 T-SQL 在查询中执行条件逻辑和计算

使用 SQL Server 还可以调试存储过程,这在使用包含复杂业务逻辑的存储过程时很有用。调试程序允许设置断点、定义监视表达式以及创建逐步执行的过程,如图 21 所示。

21 SQL Server 中的高级查询调试

Access 查询与 SQL Server 用户定义的函数

除了 SQL Server 中内置的函数外,您还可以指定自定义的 T-SQL 语句块。它们称为用户定义的函数 (UDF)。UDF 的实现方式与编程语言中的函数的实现方式相同,UDF 是一项强大的功能,它允许重用代码和封装业务逻辑。UDF 可以返回单个(标量)值,也可以返回一个表。

标量 UDF

例如,可以编写一个 UDF 来接受货币值、执行税收计算,然后返回税前价格。然后即可从任何需要计算税收的存储过程中调用此函数。

UDF

SQL Server 2000 引入了 table 数据类型,它可以从函数中返回数据表。与为了对数据子集执行查询而创建物理表然后丢弃物理表相比,在 UDF 中使用 table 数据类型更有效。它们存储在内存中并在内存中进行处理,不需要进行任何磁盘访问。

有关用户定义的函数的详细信息,请参阅 User-Defined Functions

表触发器和视图触发器

SQL Server 已增加了对触发器的支持。触发器是在表中更新、删除或插入数据时执行的存储过程。可以将触发器设置为在特定的行或字段发生更新时运行。请注意,可以使用触发器来确保引用的完整性,这一点与约束非常类似。但约束比触发器更有效,应尽可能使用约束。

可以使用触发器在表中的数据发生更改时执行某些自定义操作。例如,您可以设置一个触发器,将插入或更新的数据与另一个表中另一个字段的数据进行比较,然后对该字段中的数据进行相应的更新,或显示自定义的错误消息。有关使用触发器强制应用业务规则的详细信息,请参阅 Enforcing Business Rules with Triggers

可以通过 SQL Server 企业管理器在 Visual Studio .NET 数据库项目中创建触发器,如图 22 所示。

22 :在 Visual Studio .NET 数据库项目中创建的触发器

可伸缩性和性能

在扩展数据库解决方案以满足增长的业务需求方面,SQL Server 的优势要远远超过 Access。而且,改进后的客户端/服务器体系结构还能将处理负载分散开来,从而可以大大提高性能。

支持更多的并发用户

Access 最多支持 255 个并发用户,这并不适合作为企业级数据存储解决方案。在生产环境中,仅仅 20 个用户通过网络同时使用 Access 数据库时就常常会遇到严重的性能问题以及数据被损坏的问题。

SQL Server 支持的并发用户数量只受可用系统内存的限制,而且由于它具有优化的查询处理引擎,还能够同时使用多台计算机、多个处理器和硬盘驱动器,因此可以进行扩展以满足任何企业需求。

支持更大的数据库

Access 支持的最大数据库大小为 2 GB,还允许使用链接的表。尽管从理论上讲使用链接的表可以存储更多数据,但随着处理的数据量的增加,通常会出现性能问题和网络问题。有关详细信息,请参阅本文前面的引擎实现一节。

SQL Server 的存储能力已经大大提高,可以在多台设备上有效地存储 1,048,516 TB 的数据。

日志文件可以保留所有数据库活动的记录

与 Access 相比,SQL Server 的优点之一是所有事务(数据库更新、插入和删除)都保留在日志文件中。该日志记录了数据更改和详细的信息,如果需要,以后可以利用这些信息撤消在每个事务中所做的更改。

您可以使用诸如 Lumigent Log Explorer 之类的工具查看 SQL Server 事务日志,并手动撤消事务(参阅图 23)。有关详细信息,请访问 Lumigent Web 站点。

23 :通过查看所有过去的事务, Lumigent Log Explorer 使您可以完全控制 SQL Server 数据库。

分散到多台设备上的数据库和日志文件

Access 数据库作为一个 .mdb 文件进行存储,因此只能在一台计算机上存储和运行。这可能会随着数据库和用户数量的增加而产生问题,因为处理能力和存储空间受每台数据库服务器硬件的制约。

SQL Server 中的数据库是一组由 SQL Server 管理的物理文件。这些文件中至少包括一个事务日志文件(扩展名为 .ldf)和一个主要数据文件(扩展名为 .mdf)。SQL Server 数据库还可以具有一个或多个次要数据文件(扩展名为 .ndf)。主要数据文件用作数据库的起点,还包含数据以及对次要数据文件的引用。

使用大型数据库时,通过在相互独立的计算机上存储事务日志和多个数据文件,您可以利用多台计算机的处理能力,还可以帮助您使用多台计算机或多个硬盘的存储空间。

更可靠的查询

  • 当 Access 开发人员尝试运行查询、窗体或基于查询的报表时,可能会遇到 Out of Memory(内存不足)或 Query too Complex(查询太复杂)错误。这通常是因为您要执行的查询中包含的表联接数超出了 Access 的处理能力。为了解决此问题,Access 开发人员通常不得不花费大量资源重新设计查询以及重建表结构。

SQL Server 已被重新设计,可以支持更灵活的查询。在一个查询中,最多可以:

  • 在 SELECT 语句中使用 256 个表

  • 使用约 256 KB 的查询文本

  • 在 SELECT 语句中使用 4096 个列

还有一点要注意,Access 最多支持 50 个嵌套的子查询,但 SQL Server 最多只能支持 32 个。

使用数据

在 Access 和 SQL Server 中创建数据查询的方式并不一样。不同之处在于使用的查询语言和查询设计器。SQL Server 还支持存储过程(一种灵活有效的数据查询存储方式)和用户定义的函数(允许您重用业务逻辑)。而且,SQL Server 还提供了比 Access 功能更强大的故障恢复模式。

查询数据

查询优化

在 Access 中远程查询数据时,所有数据都将返回客户端,而且筛选和排序也是在客户端完成的。因为 SQL Server 数据查询通常通过网络从客户端进行,所以可能会发生严重的网络带宽问题。因此,将后端系统迁移到 SQL Server 时,重要的是要重新设计查询,以便只将所需的数据集返回客户端(而不是整个数据集)。例如,某个 Access 窗体暗含的查询可能是:

SELECT * FROM Customers

打开该窗体时,上面的查询将返回整个 Customers 表。在 SQL Server 中,必须优化该查询,以便只返回当前记录。对应的 SQL 查询应为:

SELECT * FROM Customers WHERE CustomerID = 'C00010'

这样将只返回一个行/记录。每当用户导航到该窗体中的下一个或上一个记录时,CustomerID 就会发生变化,而数据库就需要重新执行查询以检索当前记录。

这种服务器端筛选方法在数据库服务器上执行筛选和排序,并且只返回最少数量的所需的数据,从而有助于减少网络通信量。

查询类型

Access 为查看和设计数据查询提供了多种方法。表 5 列出了将内置的 Access 查询类型迁移到 SQL Server 时可以使用的选项。

表 5:将 Access 查询转换为 SQL Server 查询的选项

Access 查询类型

SQL Server 迁移选项

Select

SELECT 语句可以在 T-SQL 文件、存储过程或视图中使用。还可以使用内置的 SQL Server 查询设计器来设计 SELECT 语句,该设计器与 Access 查询设计器类似(参阅图 24)。

Crosstab

Crosstab 可以作为 T-SQL 文件、存储过程或视图来实现。可以使用临时表来查询内存中的 Crosstab 所需的数据集。然后可以联接和查询临时表,以检索所需的 Crosstab 数据。

将 Access Crosstab 数据转换为可以在 SQL Server 中使用的数据可能很耗时。您可以考虑使用第三方应用程序自动执行某些步骤。

要处理 Crosstab 查询,一种更灵活有效且可扩展的解决方案是使用 SQL Server 分析服务。使用分析服务可以创建联机分析处理 (OLAP) 多维数据集,以生成复杂的动态报表。有关使用 SQL Server 分析服务处理数据的详细说明,请参阅 Analysis Services

Make table

Make table 可以作为 T-SQL 语句实现,该语句使用 SELECT INTO 子句将数据从一个表复制到另一个表中。

Update

Update 语句可以作为使用 UPDATE 子句的 T-SQL 语句或存储过程进行存储。

Append

Append 语句可以作为使用 INSERT INTO 子句的 T-SQL 语句或存储过程进行存储。

Delete

Delete 语句可以作为使用 DELETE FROM 子句的 T-SQL 语句或存储过程进行存储。

24 :设计 SELECT 查询的过程在 Access SQL Server 中很相似

查询语言功能

表 6 总结了 Access 和 SQL Server 在支持的查询语言功能方面的主要区别(摘录自《Access 2002 Desktop Developer's Handbook》,Paul Litwin 等著,SYBEX Inc. 2001 年出版)。

表 6:Access 和 SQL Server 在数据查询方面的区别

功能

是否受带有 Jet 4 SQL-92 扩展的 Access SQL 支持

是否受 SQL Server 2000 T-SQL 支持

安全性(GRANT、REVOKE 等)

事务支持(COMMIT、ROLLBACK 等)

视图 (CREATE VIEW)

临时表

FROM 子句中的联接

UPDATE 和 DELETE 语句中的联接

支持 FULL OUTER JOIN 和 UNION JOIN

支持在 UPDATE 语句的 SET 子句中使用子查询

支持在 DELETE 语句中使用多个表

SELECT DISTINCTROW

SELECT TOP

游标(DECLARE CURSOR、FETCH 等)

域支持(CREATE DOMAIN、ALTER DOMAIN 等)

支持检查约束

声明(CREATE ASSERTION、DROP ASSERTION 等)

行值构造函数

CASE 表达式

在 CREATE TABLE 语句中实现完全的引用完整性支持

标准化的系统表和错误代码

标准数据类型

标准字符串运算符

标准通配符

支持 VBA 函数

其他聚合函数

TRANSFORM 语句

在查询或存储过程中使用参数

SELECT INTO 语句

有关在 SQL Server 中设计 Access 查询的详细信息,请参阅 Migrating Your Access Database to Microsoft SQL Server 7.0。(注意:这篇文章是针对 SQL Server 7.0 编写的,尚未进行更新。)

为对象编写脚本的能力

结构化查询语言 (SQL) 是 Access 和 SQL Server 进行数据访问和数据处理时使用的标准语言。SQL 语言的最新修订版称为 SQL-92,以完成修订的年份命名。Microsoft 在基本 SQL 语言中添加了自己的某些扩展,这些扩展在两个 DBMS 解决方案中是不同的。

Access 支持带有 Jet 4 ANSI-92 扩展的 SQL-92,这使您可以使用 SQL 来管理事务。

Jet 4 ANSI-92 扩展还使您可以更轻松地管理数据库安全性。但它不支持某些功能,例如,设置和更改数据库对象所有权。

在 SQL Server 2000 中,Microsoft 在基本 SQL-92 语言中添加了一些自定义扩展。这些扩展增加了对某些重要功能的脚本支持,例如:

  • 存储过程

  • 分布式事务

  • 操作系统函数

  • 更灵活的子查询

  • 在查询中使用别名

  • 备份和恢复数据

T-SQL 语言是对标准 SQL 命令集的有力扩展。它提供了执行以下操作所需的所有功能:

  • 在数据库表中检索、修改、删除和添加数据

  • 接受和返回参数

  • 执行计算

  • 运行内置函数和用户定义的函数

  • 在服务器之间复制数据

T-SQL 就像 Access 查询和 VBA 之间的桥梁,因为它使数据查询可以与条件逻辑和计算组合在一起。

请注意,SQL Server 完全支持 SQL-92 标准,因此不需要使用扩展。

表变量:对复杂查询很有用

要在 Access 中对一组联接表执行计算,您需要创建一个定义联接的查询。在使用该数据的应用程序中,每次在 SQL SELECT 语句中使用该查询时,所有表都需要重新联接,这可能就是一项耗费资源的操作(尤其是在多用户环境中)。

例如,要删除名字以字母 A 开头的所有客户并删除所有客户订单和订单历史记录,在 Access 中,您需要:

  1. 创建一个 SELECT 查询,以获得所有需要的客户 ID:

SELECT Customers.CustomerID FROM Customers WHERE Customer.FirstName LIKE 'A%'

  1. 将上面的 SELECT 查询包括在三个 DELETE 查询中,以删除所有需要的客户、订单和订单历史记录:

DELETE FROM Orders WHERE Orders.CustomerID IN ( SELECT Customers.CustomerID FROM Customers WHERE Customer.FirstName LIKE 'A%' ) And DELETE FROM OrderHistory WHERE OrderHistory.CustomerID IN ( SELECT Customers.CustomerID FROM Customers WHERE Customer.FirstName LIKE 'A%' ) And DELETE FROM Customers WHERE Customer.FirstName LIKE 'A%'

以这种方式执行该操作的效率非常低,因为每个删除操作都需要对 Customers 表运行耗费资源的 LIKE 筛选。如果 Customers 表中的记录增加到数百万条,执行此类通配符 WHERE 筛选就会产生严重的性能问题。

执行该操作的更有效的方式是使用表变量,这是 SQL Server 提供的一项功能。表变量的使用方式类似于 SQL 语法中的常规表。但是,表变量与常规表的不同之处在于表变量暂时存储在内存中,而不是存储在硬盘上。因为内存访问要比硬盘访问快得多,因此,在对同一个筛选或联接的数据集执行多个操作时,表变量会很有用。

要使用表变量实现上面的示例,您需要:

  1. 声明表:

DECLARE @tmpCustomerIDs TABLE (CustomerID nvarchar(50))

  1. 获得筛选的记录集并将它们存储在表变量中:

INSERT INTO @tmpCustomerIDs (CustomerID) (SELECT CustomerID FROM Customers WHERE Customers.ContactName LIKE 'A%')

  1. 使用表变量中的值,对客户、订单和订单历史记录执行所有删除操作:

DELETE FROM Orders WHERE Orders.CustomerID IN ( SELECT CustomerID FROM @tmpCustomerIDs ) And DELETE FROM OrderHistory WHERE OrderHistory.CustomerID IN ( SELECT CustomerID FROM @tmpCustomerIDs ) And DELETE FROM Customers WHERE Customers.CustomerID IN ( SELECT CustomerID FROM @tmpCustomerIDs )

临时表是 SQL Server 为了有效地对动态数据集执行操作所提供的另一个机制。与表变量不同的是,临时表停留在内存中的时间较长,因此可能需要更多的数据控制和日志记录资源。

系统故障恢复

在尝试打开已损坏的数据库时,大多数 Access 开发人员都遇到过 Unrecognized database format(无法识别的数据库格式)错误,如图 25 所示。如果系统出现故障(例如操作系统故障或停电),您可以选择以下解决方法:

  • 使用 Access 压缩和修复工具尝试从损坏的 .mdb 文件中恢复数据,然后将恢复的数据导入到空数据库中,以便尽量减少受损坏的记录数量。这并不是一个万无一失的措施,数据仍然可能会丢失。

  • 从最近的备份恢复。由于需要重新输入丢失的数据,这可能会浪费资源。

  • 运行 Jet 压缩工具 Jetcomp.exe。通常,这比运行压缩和修复工具更有效。但是,仍然无法保证所有数据都完好无损。

  • 将损坏的数据库提交给第三方数据库恢复专家,由他们使用专有方法从数据库中提取数据。这种方法的费用可能很高,而且由于让外部人员处理您的数据,还可能会带来安全隐患。

25 :尝试打开已损坏的 Access 数据库时出错

SQL Server 使您可以更好地控制数据恢复过程。您可以为每个 SQL Server 数据库选择三种恢复模式之一,以确定如何备份数据,以及在丢失数据时采取哪些措施。这三种恢复模式包括:

  • **简单恢复。**可以恢复最近的备份。

  • **完全恢复。**使数据库恢复到出现故障之前的状态。这种模式需要的系统资源和磁盘空间最多(用于日志记录)。

  • **批日志恢复。**使数据库恢复到最后一次备份日志时的状态。这种模式需要的系统资源和磁盘空间比完全恢复模式少,但很可能需要手动重新输入数据。

  • 这些恢复模式使您可以根据可用的系统资源灵活地选择进行系统故障恢复的最佳方式。

**提示:**与 Access 备份相比,SQL Server 数据备份的主要优点是,用户可以在数据库运行时完成备份,而不需要从数据库中注销。这就增加了数据库对用户的可用性,并能保证更长的正常运行时间。

比较数据库

在 Access 中,根据最新的结构更改实时更新生产数据库是一项持续的工作。您需要快速断开数据库连接以进行结构更改和数据转换,但是,如果用户依赖于该系统,则很难完成这项工作。由于可能添加了新的字段和关系,因此数据转换也需要时间。

要对 Access 数据库进行结构更改,通常需要:

  1. 由开发人员处理应用程序数据库,对包含数据的数据库进行结构更改。

  2. 跟踪对包含数据的数据库所做的更改,并编写用于执行更新的更新查询、DAO 或 ADO 代码。

  3. 完成开发后,需要在手动更新时断开数据库连接。

可以使用第三方应用程序(例如 SSW Data Renovator)自动完成上述过程中的某些操作,以帮助您尽量减少系统的不可用性,降低发生错误的可能性。SSW Data Renovator 可以将新数据库与生产数据库进行比较,然后针对二者之间的所有差异生成报表,并提供向导样式的界面,以便自动将数据迁移到新的结构中。

尽管 SQL Server 具有不需要断开数据库连接就能进行结构更新的优点,数据库管理员仍然必须:

  • 分析所有数据库架构,并针对结构更改而修改日志。

  • 手动创建迁移脚本,以便将更改推入目标数据库。

可以使用第三方工具(例如 Red-Gate SQL CompareSSW SQL Deploy)帮助您自动执行此任务,步骤如下:

  • 比较数据库中的所有对象,包括存储过程、关系、表、视图和用户定义的函数

  • 报告所有差异

  • 生成可以直接在目标数据库上运行的迁移脚本

结论

Microsoft SQL Server 2000 是企业级数据库解决方案,与 Microsoft Access 2002 相比,它极大地改进了可伸缩性、维护性和数据库恢复功能。由于 SQL Server 基于客户端/服务器体系结构,所以在通过远程连接处理和发送数据的方式上与 Access 有很大的不同。SQL Server 还提供了许多功能,使数据查询、业务逻辑重用和数据备份等任务变得更简单,更灵活。

术语

ADO.NET

Microsoft .NET Framework 附带的一种数据访问模型。它是专门为需要可伸缩性、无状态和 XML 的 Web 而设计的。

客户端 / 服务器体系结构

一种软件体系结构,它允许多个客户端向中央服务器或服务器组发出请求,并从这些服务器接收结果,从而改进了可伸缩性。这种体系结构的处理负载由客户端和服务器共同分担。

群集

一种直接在硬盘上为数据建立索引和排序的方法,大大提高了数据查询的速度。

数据转换服务

SQL Server 附带的工具,用于在使用基于 OLE DB 体系结构的多种数据源(例如 Microsoft Excel)中导入和导出数据。

OLAP

联机分析处理。一种数据存储模型,可以帮助您从不同的角度分析业务数据。例如,您可以使用 OLAP 查看某个时段以超过某个价格的价格在某个地区销售的所有产品。

SQL Server 企业管理器

SQL Server 附带的工具,使您可以轻松地管理数据库对象、用户、备份和数据库权限。

SQL Server 事件探查器

SQL Server 附带的工具,它可以识别特别耗时或耗费资源的数据库事务,从而帮助您优化查询。

SQL Server 查询分析器

SQL Server 附带的工具,用于编写和调试数据库查询。

T-SQL

Transact-SQL。对 SQL-92 标准查询语言的扩展,它提供了 SQL Server 中的扩展功能,例如存储过程、数据备份和恢复以及分布式事务。

UDDT

用户定义的数据类型。SQL Server 中的一项功能,它允许您基于现有的 SQL Server 基本数据类型创建您自己的数据类型。UDDT 使您能够对数据应用更严格的业务规则。

UDF

用户定义的函数。自定义的 T-SQL 语句块,它使您能够轻松地在整个数据库应用程序中重用业务逻辑。

Visual Studio .NET

一种集成的开发环境 (IDE),它使开发人员能够以可视方式开发各种与 Microsoft .NET 相关的应用程序。它为设计、编译、测试和部署支持 .NET 的 Web 和 Windows 应用程序提供了功能强大的工具。

XML

可扩展标记语言。一种广泛采用的标准方式,它以不需要太多人工或计算机操作即可处理的格式来表现文本和数据。

有关详细信息,请访问

Microsoft SQL Server 产品页

关于作者

Adam Cogan 是 SSW 的主要体系结构设计师。SSW 是一家 Microsoft 认证合作伙伴,专门提供基于 Office 和 .NET 的解决方案。在 SSW,Adam 使用 Microsoft 技术(例如 SQL Server 2000、.NET 和 Office 2003)开发了适用于各种业务领域的自定义解决方案。Adam 还组建了悉尼的 Microsoft .NET 用户组,并积极参与该地区的 INETA 管理过程。

© 2005 Microsoft Corporation 版权所有。保留所有权利。使用规定。

转到原英文页面