导出 Access 清单 (AccessToSQL)

如果有多个 Access 数据库,并且不确定要迁移到 SQL Server 中的哪个数据库,则可以导出项目中所有 Access 数据库的清单。 然后,可以查看和查询清单元数据,以确定要迁移的数据库和这些数据库中的对象。 此清单可让你快速查找问题的答案,例如下列问题:

  • 最大的数据库是什么?
  • 谁拥有大部分数据库?
  • 哪些数据库包含相同的表?
  • 过去六个月中哪些数据库尚未修改?
  • 哪些数据库包含私密信息?

本文末尾处提供了用于回答这些问题的查询示例。

导出的元数据

SSMA 导出有关 Access 数据库、表、列、索引、外键、查询、报告、窗体、宏和模块的元数据。 有关这些项类别的元数据将导出到单独的表中。 有关这些表的架构,请参阅 Access 清单架构

导出清单数据

要导出 Access 清单,必须先打开或创建 SSMA 项目,然后添加要分析的 Access 数据库。 将数据库添加到 SSMA 项目后,可将有关这些数据库的元数据导出到指定的 SQL Server 数据库和架构。 如有必要,SSMA 会创建表来存储元数据。 然后,SSMA 将有关 Access 数据库的元数据添加到 SQL Server 数据库。

注意

Access 数据库可以拆分为多个文件:包含表的后端数据库,以及包含查询、窗体、报告、宏、模块和快捷方式的前端数据库。 如果要将拆分数据库迁移到 SQL Server,请将前端数据库添加到 SSMA。

以下说明介绍如何创建项目,将数据库添加到项目,连接到 SQL Server,然后导出清单数据。

创建项目

  1. 打开 SSMA for Access。

  2. 在“文件”菜单中,选择“新建项目”

    此时将出现“新建项目”对话框。

  3. 在“名称”框中,输入项目的名称。

  4. 在“位置”框中,输入或选择项目的文件夹。

  5. 在“迁移到”组合框中,选择要迁移至的目标版本,然后选择“确定”

有关创建项目的详细信息,请参阅创建和管理项目

查找和添加数据库

  1. 在“文件”菜单上,选择“查找数据库”

  2. 在“查找数据库向导”中,输入要搜索的驱动器、文件路径或 UNC 路径。 或者,选择“浏览”以选择驱动器或网络文件夹。

  3. 选择“添加”,将位置添加到列表框。

    重复上述两个步骤以添加其他搜索位置。

  4. 或者,添加搜索条件以优化返回的数据库列表。

    重要

    “全部或部分文件名”文本框不支持通配符。

  5. 选择“扫描”

    此时会出现“扫描”页面。 该页面中显示找到的数据库和搜索进度。 要停止搜索,请选择“停止”

  6. 在“选择文件”页面上,选择要添加到项目的每个数据库。

    可以使用列表顶部的“全选”和“全部清除”按钮来选择或清除所有数据库。 还可以按住 Ctrl 键以选择多行,或按住 Shift 键以选择行范围。

  7. 选择下一步

  8. 在“验证”页面上,选择“完成”

有关将数据库添加到项目的详细信息,请参阅添加和删除 Access 数据库文件

连接到 SQL Server

  1. 在“文件”菜单上,选择“连接到 SQL Server”

  2. 在“连接”对话框中,输入或选择 SQL Server.实例的名称。

    • 如果要连接到本地计算机上的默认实例,可以输入 localhost 或一个点 (.)。

    • 如果要连接到另一台计算机上的默认实例,请输入此计算机的名称。

    • 如果要连接到命名实例,请输入计算机名称、反斜杠和实例名称。 例如:MyServer\MyInstance。

  3. 在“数据库”框中,为导出的元数据输入目标数据库的名称。

  4. 如果 SQL Server 的实例配置为接受非默认端口上的连接,请在“服务器端口”框中输入用于 SQL Server 连接的端口号。 对于 SQL Server 的默认实例,此默认端口号为 1433。 对于命名实例,SSMA 将尝试从 SQL Server Browser 服务中获取端口号。

  5. 身份验证下拉列表中,选择用于连接的身份验证类型。 要使用当前的 Windows 帐户,请选择“Windows 身份验证”。 要使用 SQL Server 登录名,请选择“SQL Server 身份验证”,然后提供用户名和密码。

有关如何连接到 SQL Server 的详细信息,请参阅连接到 SQL Server (AccessToSQL)

导出清单信息

  1. 在“Access 元数据资源管理器”中,展开 Access-metabase

  2. 选中“数据库”旁边的复选框。

    要忽略个别数据库或数据库对象,请展开数据库文件夹,然后清除数据库或数据库对象旁边的复选框。

  3. 右键单击“数据库”,选择“导出架构”

  4. 在“选择导出架构”对话框中,为导出的元数据选择目标架构,然后选择“确定”

每次导出元数据时,SSMA 都会将数据追加到清单。 不会更新或删除清单中的现有数据。

查询导出的元数据

导出有关 Access 数据库的元数据后,可以查询元数据。 以下说明介绍如何使用 SQL Server Management Studio 中的“查询编辑器”窗口来运行查询。

查询元数据

  1. 从“开始”菜单中,指向“所有程序”、“Microsoft SQL Server 2005”、“Microsoft SQL Server 2008”或“Microsoft SQL Server 2012”,然后选择“SQL Server Management Studio”

  2. 在“连接到服务器”对话框中,验证设置,然后选择“连接”

  3. 在 Management Studio 工具栏上,选择“新建查询”以打开查询编辑器。

  4. 在“查询编辑器”窗口中输入查询。 以下部分显示其中一些示例。

  5. 按 F5 键运行查询。

查询示例

在运行以下任何查询之前,应运行 USE database_name 查询,以确保针对包含导出的元数据的数据库运行查询。 例如,如果将元数据导出到名为 MyAccessMetadata 的数据库,将在 Transact-SQL 代码的开头添加以下语句:

USE MyAccessMetadata;
GO

以下示例都使用 dbo 架构。 如果将元数据导出到另一个架构,请确保在运行这些查询时更改架构。

这些数据库中有哪些表和列?

以下查询联接包含列、表和数据库元数据的表,然后返回按列名排序的所有数据库、表和列的名称:

SELECT DatabaseName,
    TableName,
    ColumnName
FROM dbo.SSMA_Access_InventoryColumns C
INNER JOIN dbo.SSMA_Access_InventoryTables T
    ON C.TableId = T.TableId
INNER JOIN dbo.SSMA_Access_InventoryDatabases 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 T
INNER JOIN dbo.SSMA_Access_InventoryDatabases 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 C
INNER JOIN dbo.SSMA_Access_InventoryTables T
    ON C.TableId = T.TableId
INNER JOIN dbo.SSMA_Access_InventoryDatabases D
    ON T.DatabaseId = D.DatabaseId
WHERE ColumnName LIKE '%salary%';

如果不知道列名,可以编写查询以返回所有列。 为此,请从上一个查询中删除 WHERE 子句。

另请参阅