如果有多个 Access 数据库,并且不确定要将哪些数据库迁移到SQL Server,则可以导出项目中所有 Access 数据库的清单。 然后,可以查看和查询清单元数据,以确定这些数据库中要迁移的数据库和对象。 通过此清单可以快速找到问题的答案,如下所示:
最大的数据库是什么?
谁拥有大部分数据库?
哪些数据库包含相同的表?
过去六个月未修改哪些数据库?
哪些数据库包含私人信息?
本主题末尾提供了用于回答这些问题的查询示例。
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 (AccessToSQL)
。
导出库存信息
在“Access 元数据资源管理器”中,展开
“Access-metabase
”。
选中“
数据库
”旁边的复选框。
若要省略单个数据库或数据库对象,请展开
“数据库”
文件夹,然后清除数据库或数据库对象旁边的复选框。
右键单击“
数据库
”,然后选择“
导出架构
”。
在
“选择导出架构
”对话框中,选择导出元数据的目标架构,然后单击“
确定
”。
每次导出元数据时,SSMA 都会将数据追加到清单。 清单中的现有数据不会更新或删除。
导出有关 Access 数据库的元数据后,可以查询元数据。 以下说明介绍如何使用 SQL Server Management Studio 中的“查询编辑器”窗口来运行查询。
查询元数据
在
“开始
”菜单中,依次指向
“所有程序
”、“
Microsoft SQL Server 2005
或
Microsoft SQL Server 2008
或
Microsoft SQL Server 2012
”,然后单击“
SQL Server Management Studio
”。
在“
连接到服务器
”对话框中,验证设置,然后单击“
连接
”。
在 Management Studio 工具栏上,单击“
新建查询
”以打开查询编辑器。
在“查询编辑器”窗口中,输入查询。 以下部分演示了一些示例。
按 F5 键运行查询。
在运行以下任何查询之前,应运行 USE
database_name
查询,以确保针对包含导出元数据的数据库运行查询。 例如,如果将元数据导出到名为 MyAccessMetadata 的数据库,则会在 Transact-SQL 代码的开头添加以下内容:
USE MyAccessMetadata;
以下示例都使用 dbo 架构。 如果将元数据导出到另一个架构,请确保在运行这些查询时更改架构。
这些数据库中有哪些表和列?
以下查询联接包含列、表和数据库元数据的表,然后返回按列名称排序的所有数据库、表和列的名称:
SELECT DatabaseName, TableName, ColumnName
FROM dbo.SSMA_Access_InventoryColumns C
JOIN dbo.SSMA_Access_InventoryTables T
ON C.TableId = T.TableId
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
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
JOIN dbo.SSMA_Access_InventoryTables T
ON C.TableId = T.TableId
JOIN dbo.SSMA_Access_InventoryDatabases D
ON T.DatabaseId = D. DatabaseId
WHERE ColumnName LIKE '%salary%';
如果不知道列名,可以编写查询以返回所有列。 为此,请从上一个查询中删除 WHERE 子句。
准备用于迁移的 Access 数据库