比较数据库架构概述
更新:2007 年 11 月
可以使用 Visual Studio Team System Database Edition 比较两个数据库的架构,然后决定是否将源数据库中的部分或全部架构对象应用于目标数据库。有关示例方案,请参见为什么比较数据库架构?
可以对以下双方的架构进行比较:
两个数据库(包括同一数据库的两个版本)
一个 Visual Studio 数据库项目和一个数据库
在配置比较时,可以使用“架构比较”对话框来指定源和目标。有关更多信息,请参见如何:比较两个数据库的架构。
架构比较结束后,将显示比较结果供用户查看。有关更多信息,请参见如何:查看架构区别。然后,可以将架构元素从源传播到目标。有关更多信息,请参见如何:同步数据库架构。
为什么比较数据库架构?
下面的文章描述了一种需要比较数据库架构的情形。在这种情况下,需要比较一个数据库和一个数据库项目,而不是比较两个数据库。
团队数据库开发
您是一位数据库开发人员,并且正在使用 Database Edition 数据库项目帮助创建数据库。经过一段时间的努力,您的团队生成了一系列数据库版本,并将其部署到测试服务器上。团队中的其他成员也参与了数据库的设计工作。
您刚刚对数据库架构进行了一轮更改,并且在您自己的计算机上对这些更改进行了测试。由于没有发现错误,因此您现在要将这些更新发布到测试服务器上,使团队中的质量保证人员可以对其进行测试。
您打开数据库项目,并通过使用“新建架构比较”对话框与测试服务器建立了连接。然后,对您的项目(源)和已部署的数据库(目标)进行比较,并确定两者之间的许多对象存在差异。但是您还发现大多数差异存在于并不由您负责的对象中。其他人员进行了这些更改,而您不想覆盖它们。
现在,只需选择您更改过的对象,然后单击“写入更新”。此操作将更新数据库中您更改过的部分,并保留其他部分不动。您的工作现在已经部署并且可以测试了。
下面的部分描述 Team Edition for Database Professionals 如何显示发生了更改的架构对象并帮助您决定应采取的操作。
控制架构比较
可以在两个级别指定控制架构比较过程和脚本生成过程的选项。若要在全局范围内设置选项,请打开“工具”菜单,单击“选项”,展开“数据库工具”,然后单击“架构比较”。除非为特定的比较重写了全局选项,否则设置的全局选项将影响所有的后续架构比较操作。
架构比较视图
完成两个架构的比较后,“架构比较”窗口将在网格中显示结果。此窗口还会显示有关数据库中对象的信息,包括用于同步这些对象的脚本。
了解架构比较结果
查看对象定义
预览更新脚本
了解架构比较结果
“架构比较”窗口占据了 Visual Studio 的主编辑区域。此窗口显示了两个架构中的所有对象,这些对象按可展开的文件夹进行组织。这些对象包括表、视图、存储过程、函数、用户定义类型、规则、默认值、全文目录、用户和角色。
此窗口中的各列显示了关于每个对象的下列信息:
第一列为“状态”列,用于显示所比较对象的比较状态:
等于。源对象和目标对象在结构上相同。
不同。源对象和目标对象在结构上不同。
缺失。目标中存在的对象在源中不存在。
新建。源中存在的对象在目标中不存在。
说明: 将在您设置的任何架构比较选项的上下文中判断对象是相同还是不同的。有关更多信息,请参见控制架构比较。
第二列列出了源中架构对象的名称并按对象类型分层组织。在此列中,可以通过展开和折叠节点以只显示想查看的对象类型。
第三列为“更新操作”列,用于显示可以同步两个架构中的对象结构的操作(针对特定对象)。(更改只写入目标中。) “更新操作”列中的值与“状态”列中的值对应。对于每个对象,您都可以选择“跳过”操作,该操作将按比较之前的状态保留目标中的对象。如果选中“包含依赖项”复选框,则可能无法跳过更新。(若要验证此复选框的状态,请打开“工具”菜单,然后单击“选项”。) 例如,如果源数据库包含一个带有索引、键和触发器的新表,并且您添加了这些索引、键和触发器,则将无法跳过该表。
说明: 更改“更新操作”列中的值实际上是更改将要运行的更新脚本。换句话说,这将更改单击“写入更新”时显示的结果。有关更多信息,请参见如何:同步数据库架构。
下表总结了这些操作:
比较状态 |
可用的更新操作(默认操作以粗体显示。) |
默认操作的说明 |
等于 |
跳过 |
“跳过”是相同对象的默认操作,此操作保持对象不变。 |
不同 |
更新、跳过 |
“更新”是不同对象的默认操作,此操作更改目标数据库中对象的结构。例如,“更新”操作可以添加、删除或重命名表中的列。 |
缺失 |
删除、跳过 |
“删除”是源数据库中不存在的对象的默认操作,此操作删除目标数据库中相应的对象。 |
新建 |
创建、跳过 |
“创建”是目标数据库中不存在的对象的默认操作,此操作在目标数据库中创建相应的对象。 |
- 第四列列出了目标中架构对象的名称。
查看对象定义
也可以查看在“架构比较”窗口中列出的每个数据库对象的 SQL 定义。在主文档窗口中单击对象的行时,其定义将以只读形式显示在“对象定义”窗格中。“对象定义”窗格的左侧显示源中所选对象的定义,右侧显示目标中所选对象的定义。可以使用任意一侧的滚动条同时滚动两个定义区域。源对象定义和目标对象定义中存在差异的行将突出显示。
对象定义反映了运行比较时对象的状态。当更改“更新操作”列中的值或对象在此架构比较会话之外进行更改时,对象定义将不会更改。
预览更新脚本
比较架构还将自动生成同步脚本并将其显示在“架构更新脚本”窗口中。这种数据定义语言 (DDL) 脚本将用于更新目标。此脚本只包含比较状态为“更新”、“删除”或“创建”的对象。要跳过的项目不会显示在“架构更新脚本”窗口中。
在更改“更新操作”列中的值时,“架构更新脚本”窗口将反映您的更改。
说明: |
---|
更新“脚本预览”窗格中的内容可能需要几秒钟,具体取决于在“更新操作”列中更改的程度。 |
尽管可以通过更改更新操作来更改 DDL 脚本,但是,因为“脚本预览”窗格为只读,所以不能直接在此窗口中编辑脚本。如果要编辑更新脚本,请单击“导出到编辑器”,然后在 Transact-SQL (T-SQL) 编辑器中修改更新脚本。
刷新比较结果
可以更新显示源架构和目标架构之间的差异的视图。完成一次源和目标的比较后,如果源架构和目标架构中的任一个发生更改或同时发生更改,则可能需要刷新视图。如果更改架构比较选项,也可能需要刷新结果。单击“刷新”时,将重新使用以前指示的配置信息以生成新的比较数据。
自最近一次架构比较之后,可能在源中添加或从源中删除了数据库对象。在这种情况下,当单击“刷新”时,架构比较将根据需要尝试在新的比较中包含新对象并从中排除已删除的对象。但是,如果为某个特定的对象更改了“更新操作”设置,则无论该对象自最近一次架构比较之后发生了任何更改,都将保留该设置。
安全传播数据库架构
传播数据库架构可能导致数据丢失。要避免数据丢失,应该高度注意源和目标中的对象名称,特别是在更新目标中的架构之前。
例如,目标中包含一个名为“Order_Details”的表。在源数据库中,您将其重命名为“Order Details”,去掉了下划线。然后比较两个数据库。在将架构从源传播到目标之前,两个表中的数据是相同的。但是,将架构更新写入目标后,“Order_Details”表将会被删除,并创建一个新的“Order Details”表。“Order_Details”表中的数据可能会全部丢失。
可以打开“工具”菜单,单击“选项”,然后选择“如果可能发生数据丢失则阻止架构更新”复选框以防止数据丢失。另外,在将更改部署到数据库之前始终应该备份数据库。