---
title: "将 DatabaseSpy 连接到云端的 SQL Azure 数据库"
date: "2010-07-01"
tags: 
  - "database-tool"
  - "databasespy"
  - "sql-server"
  - "tech-ed"
description: 了解如何将 DatabaseSpy 连接到 SQL Azure 数据库，如何管理数据库迁移，以及如何解决在云数据库集成过程中遇到的常见问题。
---
Status: #blog

Tags:  #database-tool #databasespy #sql-server #tech-ed

Categories: [Altova](/blog/zh/category/altova.md) 
# 将 DatabaseSpy 连接到云端的 SQL Azure 数据库

在纽奥尔良举行的Tech-Ed会议上，六月份的主题是关于如何简化将微软云数据库SQL Azure引入生产环境的技巧和方法。SQL Azure建立在微软SQL Server技术之上，旨在提供由微软在云端托管的、高可用性和可扩展性的数据库服务。使用SQL Azure部署数据库的开发者无需安装、配置、更新或管理任何关系型数据库软件，只需要管理自己的数据库结构和内容。该服务内置了自动冗余和容错机制，无需进行任何物理层面的管理。 

您可以手动配置连接字符串，并使用 SQL Server 的语法和数据类型，将 [DatabaseSpy](https://www.altova.com/zh/databasespy.html) 以及 [其他 Altova 工具](https://www.altova.com/zh/solutions/database-tools.html) 连接到 SQL Azure 数据库，从而执行常见的数据库开发和维护任务。 这篇文章介绍了如何使用DatabaseSpy连接到SQL Azure数据库，并演示了在将现有数据库迁移到云端时，您可能需要执行的一些常见操作。 如果您想自行重现这些步骤，您需要一个 Azure SQL 账户，或者由 Azure SQL 账户的持有者为您创建的登录名和密码。 如需了解有关如何设置 SQL Azure 账户的更多信息，请访问微软的 [SQL Azure 官方页面](http://msdn.microsoft.com/en-us/azure/sqlazure/default.aspx)。 您还需要安装 [SQL Server Native Client 10.0](http://msdn.microsoft.com/en-us/library/ms131321.aspx) (或更高版本)。 SQL Azure 的行为与本地 SQL Server 数据库并不完全相同，因此我们无法使用 Altova SQL Server 连接向导。 我们将会使用 ODBC 连接。 

[![DatabaseSpy ODBC 连接对话框](https://lh5.ggpht.com/_REdrfeVqYdU/TCufLyT6UKI/AAAAAAAAAKI/2GXVaQshqsM/tn23_01_thumb%5B2%5D.gif?imgmax=800 "DatabaseSpy ODBC Connection Dialog")](http://lh6.ggpht.com/_REdrfeVqYdU/TCufLuJMxEI/AAAAAAAAAKE/s2TpUrv90uA/s1600-h/tn23_01%5B4%5D.gif) 

在这里，我们不会详细介绍构建新连接字符串的全部步骤。您可以将现有的连接字符串复制并粘贴到上面显示的对话框中。

连接到 SQL Azure 数据库的第一次连接后，DatabaseSpy 项目文件允许您保存所有连接设置，以及常用的 SQL 脚本、数据库设计文件和数据库比较结果，并将它们以方便的方式打包，以便稍后重新加载。下图显示了一个新的 DatabaseSpy 项目，它同时连接了两个数据库：一个是在 MySQL 中的 Sakila 数据库，另一个是在 SQL Azure 云中的 Sakila 数据库。 

[![数据库侦察工具项目辅助窗口](https://lh5.ggpht.com/_REdrfeVqYdU/TCufMjbPtjI/AAAAAAAAAKQ/fS_AUAY_9Z8/Compare%201_thumb%5B2%5D.gif?imgmax=800 "DatabaseSpy Project Helper Window")](http://lh5.ggpht.com/_REdrfeVqYdU/TCufMdJkgTI/AAAAAAAAAKM/_QSKYzv0bec/s1600-h/Compare%201%5B4%5D.gif) 

微软提供多种转换工具，帮助用户将现有数据库迁移到 SQL Azure 平台。我们使用 Microsoft 的 [SQL Server 迁移助手 (用于 MySQL)](http://www.microsoft.com/downloads/details.aspx?FamilyID=0e6168b0-2d0c-4076-96c2-60bd25294a8e&displaylang=en)，将本地的 MySQL Sakila 示例数据库转换为我们的 SQL Azure 账户。DatabaseSpy 允许用户同时打开多个连接，甚至可以连接到不同类型的数据库。DatabaseSpy 的数据库比较功能使其成为检查 Sakila 转换结果的理想工具。首先，我们将打开一个数据库模式比较，并在比较的左侧选择几个来自 MySQL 数据库的表。 

[![数据库侦察工具的比较选择对话框](https://lh6.ggpht.com/_REdrfeVqYdU/TCufNE4eOHI/AAAAAAAAAKY/pgXiSLJ_wXA/Compare%202_thumb%5B2%5D.gif?imgmax=800 "DatabaseSpy Comparison Selection Dialog")](http://lh4.ggpht.com/_REdrfeVqYdU/TCufM6yZIQI/AAAAAAAAAKU/Btk68j9iQDY/s1600-h/Compare%202%5B4%5D.gif) 

在从 Azure SQL 版本中选择相应的表之后，这些表将会在一个数据库模式比较窗口中打开。 

[![数据库Spy 模式比较功能](https://lh4.ggpht.com/_REdrfeVqYdU/TCufNyt1dMI/AAAAAAAAAKg/S2qbtTidi5I/Compare%203_thumb%5B2%5D.gif?imgmax=800 "DatabaseSpy Schema Comparison")](http://lh4.ggpht.com/_REdrfeVqYdU/TCufNixS44I/AAAAAAAAAKc/4JElxf6ZDSY/s1600-h/Compare%203%5B4%5D.gif) 

当我们点击窗口左上角绿色“比较”按钮时，DatabaseSpy 会比较数据库结构，突出显示差异，并在消息窗口中生成一份摘要。 

[![数据库Spy的模式比较功能，可显示差异](https://lh4.ggpht.com/_REdrfeVqYdU/TCufPGxojBI/AAAAAAAAAKo/laurJr68vX8/Compare%204_thumb%5B2%5D.gif?imgmax=800 "DatabaseSpy Schema Comparison with Differences")](http://lh3.ggpht.com/_REdrfeVqYdU/TCufOBsbJrI/AAAAAAAAAKk/AYlEquPw-lQ/s1600-h/Compare%204%5B4%5D.gif) 

某些差异反映了不同数据库之间的数据类型定义的不同。例如，MySQL中的“unsigned small int”类型在SQL Server中没有完全对应的类型，因此转换工具将“film”表中“film_id”列的数据类型替换为“int”类型。此外，MySQL中“release_year”列的数据类型为“year”，而在SQL Azure中已转换为“smallint”。我认为，这会使SQL Azure版本的数据库具有更好的兼容性，因为它能够存储到32767年的电影信息，而MySQL中“year”类型的数据类型最大值为2155年！我们可以通过右键单击上下文菜单中的选项，在新的数据比较窗口中打开选定的表，从而比较两个数据库中的数据。 

[![数据库侦察工具的比较功能，右键菜单](https://lh3.ggpht.com/_REdrfeVqYdU/TCufP3dYyYI/AAAAAAAAAKw/AgpXSG9shps/Compare%205_thumb%5B2%5D.gif?imgmax=800 "DatabaseSpy Comparison Context Menu")](http://lh6.ggpht.com/_REdrfeVqYdU/TCufPiZEFaI/AAAAAAAAAKs/hYOu8AvEs0c/s1600-h/Compare%205%5B4%5D.gif) 

数据对比显示，这些表格的内容并不完全相同。 

[![数据库Spy内容比较](https://lh3.ggpht.com/_REdrfeVqYdU/TCufQj2pQTI/AAAAAAAAAK4/iedHL3kDohM/Compare%206_thumb%5B2%5D.gif?imgmax=800 "DatabaseSpy Content Comparison")](http://lh3.ggpht.com/_REdrfeVqYdU/TCufQOmH8jI/AAAAAAAAAK0/WOs9sgJRIxw/s1600-h/Compare%206%5B4%5D.gif) 

当我们打开结果窗口时，我们会发现“描述”列的数据未能成功迁移。 

[![数据库Spy内容比较及结果](https://lh6.ggpht.com/_REdrfeVqYdU/TCufRZY5fYI/AAAAAAAAALA/cIbfxoR8n8M/Compare%206a_thumb%5B2%5D.gif?imgmax=800 "DatabaseSpy Content Comparison with Results")](http://lh4.ggpht.com/_REdrfeVqYdU/TCufQ3sdyUI/AAAAAAAAAK8/wo8YQH1GPPs/s1600-h/Compare%206a%5B4%5D.gif) 

回顾一下“数据库模式比较”窗口，我们可以看到“描述”列的长度被设置为零。这解释了在“结果”窗口中，从 MySQL 中的“描述”列指向 SQL Azure 中“描述”列的红色箭头。我们无法将任何文本字符串复制到长度为零的列中。 接下来，让我们在新的“设计”窗口中打开 SQL Azure 版本的“电影”表。 

[![DatabaseSpy 图形化设计视图](https://lh3.ggpht.com/_REdrfeVqYdU/TCufSDh77CI/AAAAAAAAALI/O6EJCwm9aAs/Compare%207_thumb%5B2%5D.gif?imgmax=800 "DatabaseSpy Graphical Design View")](http://lh5.ggpht.com/_REdrfeVqYdU/TCufRp27G0I/AAAAAAAAALE/tqAUWY7CPiQ/s1600-h/Compare%207%5B4%5D.gif) 

我们可以增大“属性”窗口中描述字段的尺寸，然后运行相应的修改脚本。 

[![数据库Spy 图形化设计属性辅助窗口](https://lh3.ggpht.com/_REdrfeVqYdU/TCufSxioHUI/AAAAAAAAALQ/XoBfYWngEpg/Compare%208_thumb%5B2%5D.gif?imgmax=800 "DatabaseSpy Graphical Design Properties Helper Window")](http://lh5.ggpht.com/_REdrfeVqYdU/TCufSeBoTvI/AAAAAAAAALM/-5AGg9auKgU/s1600-h/Compare%208%5B4%5D.gif) 

[![数据库结构变更脚本 (DatabaseSpy)](https://lh3.ggpht.com/_REdrfeVqYdU/TCufUGt3eiI/AAAAAAAAALY/R4dv-V2QgO8/Compare%209_thumb%5B2%5D.gif?imgmax=800 "DatabaseSpy Database Structure Change Script")](http://lh4.ggpht.com/_REdrfeVqYdU/TCufTAQc5JI/AAAAAAAAALU/xxJcrOJkTjo/s1600-h/Compare%209%5B4%5D.gif) 

接下来，当我们再次进行数据对比时，我们发现数据已经被转换，但之前定义的字段长度为零，导致这些数据变得不可见。 

[![数据库Spy内容比较及结果](https://lh6.ggpht.com/_REdrfeVqYdU/TCufUstU4FI/AAAAAAAAALg/RkOJTSWx2mA/Compare%2010_thumb%5B2%5D.gif?imgmax=800 "DatabaseSpy Content Comparison with Results")](http://lh5.ggpht.com/_REdrfeVqYdU/TCufUepo9KI/AAAAAAAAALc/tHSQeZyaeFI/s1600-h/Compare%2010%5B4%5D.gif) 

**延迟问题** 您可以使用 DatabaseSpy 来分析云数据库与本地副本之间的延迟问题。正如我们在上面的数据对比中看到的那样，两个数据库中的影片表都包含 1000 行相同的数据。我们可以反复执行 SELECT 语句，从 SQL Azure 和本地 MySQL 数据库中检索数据，并测量结果的执行时间。DatabaseSpy SQL 编辑器的消息窗口会显示执行时间。 

[![SQL Azure 查询执行时间](https://lh5.ggpht.com/_REdrfeVqYdU/TCufVfSAhaI/AAAAAAAAALo/VNLkRWIysP8/Compare%2011_thumb%5B2%5D.gif?imgmax=800 "SQL Azure Query Execution Time")](http://lh3.ggpht.com/_REdrfeVqYdU/TCufVMdD1hI/AAAAAAAAALk/QtJfweyzCgw/s1600-h/Compare%2011%5B4%5D.gif) 

在 SQL Azure 版本的 sakila 数据库上，连续执行上述 SELECT 语句五次，结果范围从 60.632 秒到 63.851 秒。而在本地的 MySQL 数据库中，对同一张电影表执行相同的 SELECT 语句，结果如下： 

[![SQL Server 查询执行时间](https://lh3.ggpht.com/_REdrfeVqYdU/TCufWFGbw5I/AAAAAAAAALw/kmpjFre4XzQ/Compare%2012_thumb%5B2%5D.gif?imgmax=800 "SQL Server Query Execution Time")](http://lh5.ggpht.com/_REdrfeVqYdU/TCufVqTzDjI/AAAAAAAAALs/vEAzXCCR3E0/s1600-h/Compare%2012%5B4%5D.gif) 

对本地版本进行重复测试，结果显示时间相近。对于开发者而言，这意味着您的基于数据库的应用在迁移到云端时，很可能需要考虑延迟问题。您可以尝试使用Altova DatabaseSpy的[免费试用版](https://www.altova.com/zh/download/databasespy/database_tool.html)，测试您与SQL Azure的连接。
