将 Access 数据库迁移到 SQL Server

应用对象
Microsoft 365 专属 Access Access 2024 Access 2021 Access 2019 Access 2016

每个人都有局限性,Access 数据库也不例外。 例如,Access 数据库的大小限制为 2 GB,并且不能支持超过 255 个并发用户。 因此,当 Access 数据库需要更上一层楼时,可以迁移到 SQL Server。 SQL Server (无论是在本地还是在 Azure 云中,) 都支持比 JET/ACE 数据库引擎更大的数据量、更多的并发用户,并且具有更大的容量。 本指南将帮助你顺利开始 SQL Server 之旅,帮助保留你创建的 Access 前端解决方案,并希望激励你将 Access 用于未来的数据库解决方案。 使用 Microsoft SQL Server 迁移助手 (SSMA) 若要成功迁移,请按照以下阶段操作。

数据库迁移到 SQL Server 的阶段

开始之前

以下各节提供了背景和其他信息,以帮助你入门。

关于拆分数据库

所有 Access 数据库对象都可以位于一个数据库文件中,也可以存储在两个数据库文件中:前端数据库和后端数据库。 这称为 拆分数据库 ,旨在促进在网络环境中共享。 后端数据库文件必须仅包含表和关系。 前端文件必须仅包含所有其他对象,包括窗体、报表、查询、宏、VBA 模块和后端数据库的链接表。 迁移 Access 数据库时,它类似于拆分数据库,因为 SQL Server 充当当前位于服务器上的数据的新后端。

因此,您仍然可以使用链接表到 SQL Server 表来维护前端 Access 数据库。 实际上,您可以获得 Access 数据库提供的快速应用程序开发的好处以及 SQL Server 的可伸缩性。

SQL Server 优势

仍需要一些说服力来迁移到 SQL Server? 以下是一些需要考虑的其他好处:

  • 并发用户更多 与 Access 相比,SQL Server 可以处理更多的并发用户,并且在添加更多用户时可以最大限度地减少内存需求。
  • 提高可用性使用 SQL Server,您可以在数据库正在使用时动态备份增量或完整备份数据库。 因此,不必强制使用户退出数据库即可备份数据。
  • 高性能和可扩展性SQL Server 数据库的性能通常优于 Access 数据库,尤其是对于 TB 大小的大型数据库。 此外,SQL Server 通过并行处理查询、在单个进程中使用多个本机线程来处理用户请求,从而更快、更高效地处理查询。
  • 增强了安全性使用受信任的连接,SQL Server 与 Windows 系统安全性集成,提供对网络和数据库的单一集成访问,并采用两种安全系统的优点。 这使得管理复杂的安全方案变得更加容易。 SQL Server 是敏感信息的理想存储,例如社会安全号码、信用卡数据和机密地址。
  • 可立即恢复性如果操作系统崩溃或断电,SQL Server 可以在几分钟内自动将数据库恢复到一致状态,而无需数据库管理员干预。
  • VPN 的使用 访问和虚拟专用网络 (VPN) 不合适。 但是使用 SQL Server,远程用户仍然可以使用桌面上的 Access 前端数据库和位于 VPN 防火墙后面的 SQL Server 后端。
  • Azure SQL Server 除了 SQL Server 的优势外,还提供无停机的动态可伸缩性、智能优化、全局可伸缩性和可用性、消除硬件成本并减少管理。

选择最佳 Azure SQL Server 选项

如果要迁移到 Azure SQL Server,则有三个选项可供选择,每个选项都有不同的优势:

  • 单一数据库/弹性池此选项具有自己的一组通过 SQL 数据库服务器管理的资源。 单个数据库类似于 SQL Server 中的包含数据库。 还可以添加弹性池,该池是一组数据库,其中包含通过 SQL 数据库服务器管理的一组共享资源。 最常用的 SQL Server 功能可用于内置备份、修补和恢复。 但是,无法保证准确的维护时间,从 SQL Server 迁移可能很困难。
  • 托管实例 此选项是具有一组共享资源的系统和用户数据库的集合。 托管实例类似于与本地 SQL Server 高度兼容的 SQL Server 数据库实例。 托管实例具有内置备份、修补和恢复功能,并且易于从 SQL Server 迁移。 但是,有少量 SQL Server 功能不可用,也不能保证准确的维护时间。
  • Azure 虚拟机 此选项允许你在 Azure 云中的虚拟机内运行 SQL Server。 你可以完全控制 SQL Server 引擎和简单的迁移路径。 但您需要管理备份、补丁和恢复。

有关详细信息,请参阅选择到 Azure 的数据库迁移路径和什么是 Azure SQL?。

第一步

在运行 SSMA 之前,可以预先解决几个问题,以帮助简化迁移过程:

  • 添加表索引和主键 确保每个 Access 表都有一个索引和一个主键。 SQL Server 要求所有表都至少有一个索引,并且如果表可以更新,则要求链接表必须具有主键。
  • 检查主键/外键关系 确保这些关系基于具有一致数据类型和大小的字段。 SQL Server 不支持在外键约束中具有不同数据类型和大小的联接列。
  • 删除“附件”列 SSMA 不会迁移包含附件列的表。

在运行 SSMA 之前,请执行以下初始步骤。

  1. 关闭 Access 数据库。
  2. 确保连接到数据库的当前用户也关闭数据库。
  3. 如果数据库 .mdb文件格式,则 删除用户级别安全性。
  4. 备份数据库。 有关详细信息,请参阅 使用备份和还原过程保护数据。

提示请考虑在桌面上安装 Microsoft SQL Server Express 版本,它最多支持 10 GB,是一种免费且更简单的方式来运行和检查迁移。 连接时,使用 LocalDB 作为数据库实例。

提示 如果可能,请使用独立版本的 Access。

运行 SSMA

Microsoft提供Microsoft SQL Server 迁移助手 (SSMA) ,以便简化迁移。 SSMA 主要迁移没有参数的表和选择查询。 表单、报表、宏和 VBA 模块不会转换。 SQL Server 元数据资源管理器显示 Access 数据库对象和 SQL Server 对象,以便你查看这两个数据库的当前内容。 如果将来决定转移其他对象,这两个连接将保存在迁移文件中。

备注 迁移过程可能需要一些时间,具体取决于数据库对象的大小和必须传输的数据量。

  1. 若要使用 SSMA 迁移数据库 ,请先 双击下载的 MSI 文件下载并安装软件。 确保为计算机安装合适的 32 位或 64 位版本。
  2. 安装 SSMA 后,在桌面上打开它,最好从包含 Access 数据库文件的计算机打开。
    也可以在有权从网络访问 Access 数据库的计算机上的共享文件夹中打开它。
  3. 按照 SSMA 中的开始说明提供基本信息,例如 SQL Server 位置、Access 数据库和要迁移的对象、连接信息以及是否要创建链接表。
  4. 如果要迁移到 SQL Server 2016 或更高版本,并且想要更新链接表,请选择“查看工具>”“项目设置>”常规“来添加 rowversion 列。
    rowversion 字段有助于避免记录冲突。 Access 使用 SQL Server 链接表中的此 rowversion 字段来确定记录的上次更新时间。 此外,如果将 rowversion 字段添加到查询,Access 会在执行更新操作后使用它来重新选择该行。 这通过帮助避免当 Access 检测到原始提交的不同结果时可能发生的写入冲突错误和记录删除情况(例如浮点数数据类型可能发生的情况和修改列的触发器)来提高效率。 但是,请避免在窗体、报表或 VBA 代码中使用 rowversion 字段。 有关详细信息,请参阅 rowversion。
    备注 避免将行版本与时间戳混淆。 尽管关键字 (keyword) 时间戳是 SQL Server 中 rowversion 的同义词,但不能使用 rowversion 作为为数据输入添加时间戳的方式。
  5. 要设置精确的数据类型,请选择“审阅工具”“项目设置>类型>映射”。 例如,如果仅存储英语文本,则可以使用 varchar 而不是 nvarchar 数据类型。

转换对象

SSMA 将 Access 对象转换为 SQL Server 对象,但不会立即复制这些对象。 SSMA 提供了要迁移的以下对象的列表,以便你可以决定是否要将它们移动到 SQL Server 数据库:

  • 表和列
  • 选择“不带参数的查询”。
  • 主键和外键
  • 索引和默认值
  • 检查允许零长度列属性、列验证规则、表验证) (约束

作为最佳做法,请使用 SSMA 评估报告,该报告显示转换结果,包括错误、警告、信息消息、执行迁移的估计时间,以及在实际移动对象之前要采取的各个错误更正步骤。

转换数据库对象会从 Access 元数据中获取对象定义,将其转换为等效的 Transact-SQL (T-SQL) 语法,然后将此信息加载到项目中。 然后,可以使用 SQL Server 或 SQL Azure 元数据资源管理器查看 SQL Server 或 SQL Azure 对象及其属性。

若要转换、加载对象并将其迁移到 SQL Server,请按照本指南进行操作。

提示 成功迁移 Access 数据库后,请保存项目文件以供以后使用,以便可以再次迁移数据以进行测试或最终迁移。

请考虑安装最新版本的 SQL Server OLE DB 和 ODBC 驱动程序,而不是使用 Windows 附带的本机 SQL Server 驱动程序。 较新的驱动程序不仅速度更快,而且支持 Azure SQL 中以前驱动程序不支持的新功能。 可以在使用已转换数据库的每台计算机上安装驱动程序。 有关详细信息,请参阅 Microsoft OLE DB 驱动程序 18 for SQL Server 和 Microsoft ODBC 驱动程序 17 for SQL Server。

迁移 Access 表后,可以链接到现在托管数据的 SQL Server 中的表。 直接从 Access 链接还提供了一种比使用更复杂的 SQL Server 管理工具更简单的方法来查看数据。 可以根据 SQL Server 数据库管理员设置的权限查询和编辑链接的数据。

备注如果在链接过程中链接到 SQL Server 数据库时创建 ODBC DSN,请在使用新应用程序的所有计算机上创建相同的 DSN,或者以编程方式使用 DSN 文件中存储的连接字符串。

有关详细信息,请参阅链接到 Azure SQL Server 数据库或从 Azure SQL Server 数据库导入数据和导入或链接 SQL Server 数据库中的数据。

提示 不要忘记使用 Access 中的链接表管理器来方便地刷新和重新链接表。 有关详细信息,请参阅 管理链接表。

测试和修订

以下部分介绍了在迁移期间可能遇到的常见问题以及如何处理这些问题。

查询

仅转换选择查询;其他查询则不然,包括采用参数的 Select 查询。 某些查询可能不会完全转换,并且 SSMA 会在转换过程中报告查询错误。 可以使用 T-SQL 语法手动编辑未转换的对象。 语法错误可能还需要手动将 Access 特定的函数和数据类型转换为 SQL Server 的函数和数据类型。 有关详细信息,请参阅将 Access SQL 与 SQL Server TSQL 进行比较。

数据类型

Access 和 SQL Server 具有类似的数据类型,但请注意以下潜在问题。

大数 大数数据类型存储非货币数值,并且与 SQL bigint 数据类型兼容。 此数据类型可用于高效计算大数,但它需要使用 Access 16 (16.0.7812 或更高版本) .accdb 数据库文件格式,并且使用 64 位版本的 Access 性能更好。 有关详细信息,请参阅 使用大数数据类型和在64 位或 32 位版本的 Office 之间进行选择。

是/否默认情况下,Access 的“是/否”列转换为 SQL Server 位字段。 若要避免记录锁定,请确保将位字段设置为不允许 NULL 值。 在 SSMA 中,可以选择位列以将 “允许空值” 属性设置为“否”。 在 TSQL 中,使用 CREATE TABLE 或 ALTER TABLE 语句。

日期和时间 有几个日期和时间注意事项:

  • 如果数据库的兼容性级别为 130 (SQL Server 2016) 或更高,且链接表包含一个或多个 datetime 或 datetime2 列,则该表可能会在结果中返回消息 #deleted。 有关详细信息,请参阅 Access 链接表到 SQL-Server 数据库返回 #deleted。

  • 使用 Access Date/Time 数据类型映射到 datetime 数据类型。 使用 Access 日期/时间扩展数据类型映射到具有较大日期和时间范围的 datetime2 数据类型。 有关详细信息,请参阅 使用“日期/时间扩展”数据类型。

  • 在 SQL Server 中查询日期时,应考虑时间和日期。 例如:

    • DateOrdered 19/1/1 到 19/1/31 之间可能不包括所有订单。
    • DateOrdered 介于 19/1/1 00:00:00 AM 和 19/1/31 晚上 11:59:59 之间包含所有订单。

附件 附件数据类型在 Access 数据库中存储一个文件。 在 SQL Server 中,有多个选项可供考虑。 可以从 Access 数据库中提取文件,然后考虑在 SQL Server 数据库中存储指向这些文件的链接。 或者,可以使用 FILESTREAM、FileTable 或远程 BLOB 存储 (RBS) 将附件存储在 SQL Server 数据库中。

超链接Access 表具有 SQL Server 不支持的超链接列。 默认情况下,这些列将转换为 nvarchar (SQL Server 中的最大) 列,但您可以自定义映射以选择较小的数据类型。 在 Access 解决方案中,如果将控件的 Hyperlink 属性设置为 true,则仍然可以在窗体和报表中使用超链接行为。

多值字段Access 多值字段将作为包含分隔值集的 ntext 字段转换为 SQL Server。 由于 SQL Server 不支持模拟多对多关系的多值数据类型,因此可能需要进行额外的设计和转换工作。

有关映射 Access 和 SQL Server 数据类型的详细信息,请参阅比较数据类型。

备注 不会转换多值字段。

有关详细信息,请参阅 日期和时间类型、 字符串和二进制类型以及数字 类型。

Visual Basic

尽管 SQL Server 不支持 VBA,但请注意以下可能的问题:

查询中的 VBA 函数 Access 查询支持对查询列中的数据进行 VBA 函数。 但是,使用 VBA 函数的 Access 查询无法在 SQL Server 上运行,因此所有请求的数据都将传递给 Microsoft Access 进行处理。 在大多数情况下,这些查询应转换为 直通查询。

查询中的用户定义函数 Microsoft Access 查询支持使用 VBA 模块中定义的函数来处理传递给它们的数据。 查询可以是独立查询、窗体/报表记录源中的 SQL 语句、窗体、报表和表字段上的组合框和列表框的数据源,以及默认或验证规则表达式。 SQL Server 无法运行这些用户定义函数。 可能需要手动重新设计这些函数,并将其转换为 SQL Server 上的存储过程。

优化性能

到目前为止,使用新的后端 SQL Server 优化性能的最重要方法是决定何时使用本地或远程查询。 将数据迁移到 SQL Server 时,也会从文件服务器移动到客户端-服务器数据库计算模型。 请遵循以下一般准则:

  • 在客户端上运行小型只读查询,以实现最快访问。
  • 在服务器上运行长读/写查询,以利用更强大的处理能力。
  • 通过筛选器和聚合来最大限度地减少网络流量,以仅传输您需要的数据。

优化客户端服务器数据库模型的性能 有关详细信息,请参阅 创建传递查询。

下面是其他建议指南。

在服务器上放置逻辑 应用程序还可以使用视图、用户定义函数、存储过程、计算字段和触发器,在服务器(而不是客户端)上集中和共享应用程序逻辑、业务规则和策略、复杂查询、数据验证和引用完整性代码。 问问自己,可以在服务器上更好更快地执行此查询或任务吗? 最后,测试每个查询以确保最佳性能。

在表单和报表中使用视图 在 Access 中,执行以下操作:

  • 对于窗体,只读窗体使用 SQL 视图,读/写窗体使用 SQL 索引视图作为记录源。
  • 对于报表,请使用 SQL 视图作为记录源。 但是,请为每个报表创建一个单独的视图,以便您可以更轻松地更新特定报表,而不会影响其他报表。

在表单或报表中最小化加载数据 在用户要求之前不要显示数据。 例如,将 recordsource 属性留空,让用户在窗体上选择筛选器,然后使用筛选器填充 recordsource 属性。 或者,使用 DoCmd.OpenForm 和 DoCmd.OpenReport 的 where 子句显示用户所需的确切记录 () 。 请考虑关闭记录导航。

谨慎对待异类查询避免运行结合了本地 Access 表和 SQL Server 链接表的查询,有时也称为混合查询。 此类查询仍需要 Access 将所有 SQL Server 数据下载到本地计算机然后运行查询,它不会在 SQL Server 中运行查询。

何时使用本地表 请考虑对很少更改的数据使用本地表,例如某个国家或地区的省/市/自治区列表。 静态表通常用于筛选,可在 Access 前端更好地执行。

有关详细信息,请参阅数据库引擎优化顾问、使用性能分析器优化 Access 数据库和优化链接到 SQL Server 的 Microsoft Office Access 应用程序。

另请参阅

Azure 数据库迁移指南

Microsoft 数据迁移博客

Microsoft Access to SQL Server 迁移、转换和升级

共享 Access 桌面数据库的方法