如果有多个 Access 数据库,并且不确定要迁移到 SQL Server 中的哪个数据库,则可以导出项目中所有 Access 数据库的清单。 然后,可以查看和查询清单元数据,以确定要迁移的这些数据库中的数据库和对象。 此清单可让你快速查找问题的答案,例如以下列表:
- 什么是最大的数据库?
- 谁拥有大部分数据库?
- 哪些数据库包含相同的表?
- 过去六个月中尚未修改哪些数据库?
- 哪些数据库包含专用信息?
本文末尾提供了用于回答这些问题的查询示例。
导出的元数据
SQL Server 迁移助手 (SSMA) 导出有关 Access 数据库、表、列、索引、外键、查询、报表、窗体、宏和模块的元数据。 有关这些类别项的元数据将导出到单独的表中。 有关这些表的架构,请参阅 访问清单架构。
导出清单数据
若要导出 Access 清单,必须先打开或创建 SSMA 项目,然后添加要分析的 Access 数据库。 将数据库添加到 SSMA 项目后,可将有关这些数据库的元数据导出到指定的 SQL Server 数据库和架构。 如有必要,SSMA 会创建表来存储元数据。 然后,SSMA 将有关 Access 数据库的元数据添加到 SQL Server 数据库。
注释
Access 数据库可以拆分为多个文件:后端数据库,其中包含包含查询、窗体、报表、宏、模块和快捷方式的表和前端数据库。 如果要将拆分数据库迁移到 SQL Server,请将前端数据库添加到 SSMA。
以下说明介绍如何创建项目、将数据库添加到项目、连接到 SQL Server,然后导出清单数据。
创建项目
打开 SSMA for Access。
在“文件”菜单中,选择“新建项目”。
将显示“新建项目”对话框。
在“ 名称 ”框中,输入项目的名称。
在 “位置” 框中,输入或选择项目的文件夹。
在“ 迁移到” 组合框中,选择要迁移到的目标版本,然后选择“ 确定”。
有关创建项目的详细信息,请参阅 “创建和管理项目”。
查找和添加数据库
在“ 文件 ”菜单上,选择“ 查找数据库”。
在“查找数据库向导”中,输入要搜索的驱动器、文件路径或 UNC 路径。 或者,选择“ 浏览 ”以选择驱动器或网络文件夹。
选择 “添加” ,将位置添加到列表框。
重复上述两个步骤以添加更多搜索位置。
(可选)添加搜索条件以优化返回的数据库列表。
重要
文件名文本框中的“全部或部分”不支持通配符。
选择“扫描”。
此时会显示“扫描”页。 这会显示找到的数据库和搜索进度。 若要停止搜索,请选择“ 停止”。
在“选择文件”页上,选择要添加到项目的每个数据库。
可以使用列表顶部的 “全选 ”和“ 全部清除 ”按钮来选择或清除所有数据库。 还可以按住 Ctrl 键以选择多行,或按住 Shift 键以选择一系列行。
选择“下一步”。
在“验证”页上,选择“ 完成”。
有关将数据库添加到项目的详细信息,请参阅 “添加和删除 Access 数据库文件”。
连接到 SQL Server
在“ 文件 ”菜单上,选择“ 连接到 SQL Server”。
在连接对话框中,输入或选择 SQL Server 实例的名称。
如果要连接到本地计算机上的默认实例,可以输入
localhost或点(.)。如果要在另一台计算机上连接到默认实例,请输入计算机的名称。
如果要连接到命名实例,请输入计算机名称、反斜杠和实例名称。 例如:
MyServer\MyInstance。
在 “数据库 ”框中,输入导出元数据的目标数据库的名称。
如果 SQL Server 实例配置为接受非默认端口上的连接,请在 “服务器端口 ”框中输入用于 SQL Server 连接的端口号。 对于 SQL Server 的默认实例,默认端口号为 1433。 对于命名实例,SSMA 会尝试从 SQL Server 浏览器服务获取端口号。
在 “身份验证 ”下拉列表中,选择要用于连接的身份验证类型。 若要使用当前的 Windows 帐户,请选择 “Windows 身份验证”。 若要使用 SQL Server 登录名,请选择 “SQL Server 身份验证”,然后提供用户名和密码。
有关连接到 SQL Server 的详细信息,请参阅 “连接到 SQL Server”。
导出库存信息
在 Access 元数据资源管理器中,展开 Access-metabase。
选中 “数据库”旁边的复选框。
若要省略单个数据库或数据库对象,请展开 “数据库” 文件夹,然后清除数据库或数据库对象旁边的复选框。
右键单击 “数据库 ”,然后选择“ 导出架构”。
在 “选择导出架构 ”对话框中,选择导出元数据的目标架构,然后选择“ 确定”。
每次导出元数据时,SSMA 都会将数据追加到清单。 清单中的现有数据不会更新或删除。
查询导出的元数据
导出有关 Access 数据库的元数据后,可以查询元数据。 以下说明介绍了如何使用 SQL Server Management Studio 中的“查询编辑器”窗口来运行查询。
查询元数据
从“开始”菜单导航到 SQL Server Management Studio。
在“ 连接到服务器 ”对话框中,验证设置,然后选择“ 连接”。
在 Management Studio 工具栏上,选择“ 新建查询 ”以打开查询编辑器。
在“查询编辑器”窗口中,输入查询。 以下部分显示了一些示例。
按 F5 键运行查询。
查询示例
在运行以下任何查询之前,应运行 USE database_name 查询,以确保针对包含导出元数据的数据库运行查询。 例如,如果将元数据导出到名为 MyAccessMetadata 的数据库,则会在 Transact-SQL 代码的开头添加以下语句:
USE MyAccessMetadata;
GO
以下示例均使用 dbo 架构。 如果将元数据导出到另一个架构,请确保在运行这些查询时更改架构。
这些数据库中有哪些表和列?
以下查询联接包含列、表和数据库元数据的表,然后返回按列名排序的所有数据库、表和列的名称:
SELECT DatabaseName,
TableName,
ColumnName
FROM dbo.SSMA_Access_InventoryColumns AS C
INNER JOIN dbo.SSMA_Access_InventoryTables AS T
ON C.TableId = T.TableId
INNER JOIN dbo.SSMA_Access_InventoryDatabases AS D
ON T.DatabaseId = D.DatabaseId
ORDER BY ColumnName;
什么是最大的数据库?
以下查询返回每个 Access 数据库中的数据库名称、文件大小和表数,按文件大小排序:
SELECT DatabaseName,
FileSize,
TablesCount
FROM dbo.SSMA_Access_InventoryDatabases
ORDER BY FileSize DESC;
大多数数据库的所有者是谁?
以下查询返回每个 Access 数据库的数据库名称和所有者,按所有者排序。
SELECT DatabaseName,
FileOwner
FROM dbo.SSMA_Access_InventoryDatabases
ORDER BY FileOwner;
哪些数据库包含相同的表?
以下查询使用子查询查找表列表中多次显示的所有表名称,然后使用此表列表获取数据库名称。 结果将作为数据库名称返回,然后返回表名,并按表名排序。
SELECT DatabaseName,
TableName
FROM dbo.SSMA_Access_InventoryTables AS T
INNER JOIN dbo.SSMA_Access_InventoryDatabases AS D
ON D.DatabaseId = T.DatabaseId
WHERE TableName IN (SELECT TableName
FROM dbo.SSMA_Access_InventoryTables
GROUP BY TableName
HAVING COUNT(*) > 1)
ORDER BY TableName;
过去六个月中未修改哪些数据库?
以下查询获取当前日期、获取六个月前的月份值,然后返回修改日期大于六个月前的数据库列表。
SELECT DatabaseName,
DateModified
FROM dbo.SSMA_Access_InventoryDatabases
WHERE DATEDIFF(MONTH, DateModified, GETDATE()) > 6
ORDER BY DateModified;
哪些数据库包含专用信息?
Access 数据库可能包含敏感信息或个人信息。 你可能想要将这些数据库移动到 SQL Server,以利用其安全功能。 如果知道包含敏感数据的列具有特定名称或包含特定字符,则可以使用查询查找包含该信息的所有列。 例如,可以找到包含字符串 salary的所有列。 然后,查询将返回数据库名称、表名称和列名。
SELECT DatabaseName,
TableName,
ColumnName
FROM dbo.SSMA_Access_InventoryColumns AS C
INNER JOIN dbo.SSMA_Access_InventoryTables AS T
ON C.TableId = T.TableId
INNER JOIN dbo.SSMA_Access_InventoryDatabases AS D
ON T.DatabaseId = D.DatabaseId
WHERE ColumnName LIKE '%salary%';
如果不知道列名,可以编写查询以返回所有列。 为此,请从上一个查询中删除 WHERE 子句。