如何:比较数据库架构

更新:2010 年 7 月

本主题适用于:

Visual Studio 旗舰版

Visual Studio 高级专业版

Visual Studio 专业版 

Visual Studio 学习版

主题适用 主题适用 主题不适用 主题不适用

可以使用 Visual Studio 高级专业版或 Visual Studio 旗舰版来比较两个数据库架构。 这些架构可能会由数据库、数据层应用程序项目、数据库项目或数据库项目的生成输出(.dbschema 文件)表示。 比较的实体分别称为源和目标。 完成架构比较之后,其结果会显示在**“架构比较”**窗口中。 此外,Visual Studio 还会生成一个数据定义语言 (DDL) 脚本,通过该脚本可以同步不同的架构。

如果您打算经常将一个数据库项目与目标数据库进行比较,则可以将架构比较添加到此数据库项目中。 然后,可以通过重新打开该比较来重新比较架构。 通过保存架构比较,可以保存连接信息、特定于会话的选项和 SQLCMD 变量的值。 比较的结果不会保存,当您打开所保存架构比较的 .scmp 文件时,将会重新生成结果。

比较结束后,可以执行其他步骤:

  • 可以查看两个数据库之间的结构差异。 有关更多信息,请参见查看架构差异。

  • 可以单击**“刷新更新脚本”**来查看将用于同步架构的完整脚本(如果您决定这样做)。

  • 可以更新部分或整个目标,以便与源相匹配。 有关更多信息,请参见同步数据库或服务器对象。

  • 可以对驻留在目标和源中的数据进行比较。 有关更多信息,请参见如何:比较并同步两个数据库的数据

有关架构比较方案的更多信息,请参见比较和同步数据库架构

您还可以在命令提示符处使用 VSDBCMD.EXE 比较 .dbschema 文件。 例如,当您无权直接访问目标服务器时,可以执行此操作生成一个更新脚本来更新目标数据库。

主题内容

使用“架构比较”比较两种架构

  1. 如果您希望比较两种架构,但不将您的设置保存为数据库项目的一部分,请执行以下步骤:

    1. 打开**“数据”菜单,指向“架构比较”,然后单击“新建架构比较”**。

    2. 跳到步骤 3。

  2. 如果您希望比较两种架构,然后将您的设置保存为数据库项目的一部分,请执行以下步骤:

    1. 在**“解决方案资源管理器”中,右击“架构比较”文件夹,指向“添加”,然后单击“架构比较”**。

      此时将显示**“添加新项”**对话框。

    2. 在**“名称”中,键入要指定给架构比较的名称,然后单击“添加”**。

  3. 通过为每个架构单击**“项目”“数据库”“数据库架构文件”**来指定要比较的源和目标。

    提示

    可以将一个数据库架构文件指定为目标架构,但不能更新该文件。 有关支持的比较方案的完整列表,请参见比较和同步数据库架构

  4. 如果为源或目标单击了**“数据库”**,请通过在列表中单击数据源来连接到该数据源。

    如果您的数据库未列出,请单击**“新建连接”。 在“连接属性”对话框中,确定源或目标所在的服务器以及连接该服务器时将要使用的身份验证类型。 或者可以单击该服务器上的数据库。 完成上述操作后,单击“确定”**。

    提示

    建立连接后,该连接会出现在“服务器资源管理器”中的“数据连接”下。

  5. 如果为源或目标单击了**“数据库架构文件”,请键入路径和文件名,或者单击“浏览”**以指定一个文件。

  6. (可选)单击**“选项”**以指定将比较的对象、将忽略的差异类型以及生成的更新脚本中将要包含的内容。

    重要说明重要事项

    默认情况下,架构比较使用您在打开“工具”菜单并单击“选项”时配置的选项。 如果您不希望忽略扩展属性,请单击“选项”以更改相应的设置。 有关设置架构比较选项的更多信息,请参见如何:设置比较数据库架构的选项

  7. (可选)单击**“SQLCMD 变量”**以指定一个包含变量及其值的列表的 .sqlcmdvars 文件。

    提示

    只有在比较两个项目(数据库项目、服务器项目或数据层应用程序项目)时,才能指定 SQLCMD 变量。

    在比较架构时,这些值会在相应的数据库项目中进行替换。

  8. 单击**“确定”**。

    架构比较开始。

    提示

    可以通过单击工具栏上的“停止”来停止正在进行的比较。

使用 Visual Studio 自动化模型比较架构

  1. 打开**“视图”菜单,指向“其他窗口”,然后单击“命令窗口”**。

  2. 在命令窗口中,键入下面的命令:

    Data.NewSchemaComparison sourceIdentifier targetIdentifier
    

    将 sourceIdentifier 替换为下列项之一:

    • /ProviderType ConnectionBased /ConnectionString "我的连接字符串"

    • /ProviderType ConnectionBased /ConnectionName 我的连接名

    • /ProviderType ProjectBased /ProjectName 我的文件名.dbproj

    • /ProviderType FileBased /ProjectName 我的文件名.dbschema

    • /ProviderType FileBased /ProjectName 我的文件名.dacpac

    将 targetIdentifier 替换为下列项之一:

    • /ProviderType ConnectionBased /ConnectionString "我的连接字符串"

    • /ProviderType ConnectionBased /ConnectionName 我的连接名

    • /ProviderType ProjectBased /ProjectName 我的文件名.dbproj

    • /ProviderType FileBased /ProjectName 我的文件名.dbschema

    • /ProviderType FileBased /ProjectName 我的文件名.dacpac

    如果未指定源和目标,则将显示**“新建架构比较”**对话框。 有关 Data.NewSchemaComparison 命令的参数的更多信息,请参见 Visual Studio 数据库功能的自动化命令参考

    将对指定的源和目标中的对象和设置进行比较。 比较的结果将会显示一个架构比较会话中,您可以选择保存此会话。 有关如何查看结果或同步架构的更多信息,请参见查看架构差异和同步数据库或服务器对象。

首次保存架构比较

  1. 在**“文件”菜单上,单击“保存 SchemaComparisonName.scmp”**。

    **“另存文件为”**对话框打开。

  2. 指定架构比较的路径和文件名。

    如果此比较是您的数据库项目的一部分,则此比较将保存到该项目的 SchemaComparisons 文件夹中。

  3. 单击**“保存”**。

    您的架构比较将会保存到您指定的位置。

查看架构差异

可以通过将源架构与目标架构进行比较,并在**“架构比较”**窗口中以树形式查看比较的结果,从而确定源架构与目标架构之间的差异。 例如,您可以仅显示源中存在而目标中不存在的对象。 您还可以查看有关特定对象的详细差异,并可以刷新结果以反映最近的更改。

此外,还可以在脚本中以 Transact-SQL 命令的形式查看结果,从而将目标与源同步。 可以在**“架构更新脚本”**窗口或 Transact-SQL 编辑器中显示此脚本,并可以将此脚本导出到一个文件。 如果您决定更新目标以便与源相匹配,您可以立即运行此脚本以同步架构,也可以先修改此脚本,然后运行它。 有关更多信息,请参见同步数据库或服务器对象。

按照类型筛选结果

  1. 在**“架构比较”工具栏上,单击“筛选器”**。

  2. 单击一个或多个筛选器以指定要显示的结果集。

    提示

    筛选器设置将保存在 .scmp 文件中,并会在更改源架构和目标架构时得到保留。

查看对象定义中的更改

  • 单击网格中状态为“新建”、“缺少”或“形状不同”的任意行。

刷新比较结果

  • 在**“架构比较”工具栏上,单击“刷新”**。

    这将重新比较源和目标,并且将更新比较的结果。

查看同步脚本

  • 在**“数据”菜单上,指向“架构比较”,然后单击“显示架构更新脚本”**。

    提示

    如果“显示架构更新脚本”不可用,则无法为指定的目标生成脚本或者需要刷新比较。 例如,如果目标架构是 .dbschema 文件,则无法创建更新脚本。

    **“架构更新脚本”**窗口随即出现,并显示可用于更新目标以匹配源的脚本。

    提示

    如果“架构更新脚本”窗口处于打开状态,则也可单击“刷新架构更新脚本”

在 Transact-SQL 编辑器中打开同步脚本

  • 在**“数据”菜单上,指向“架构比较”,再指向“导出到”,然后单击“编辑器”**。

    Transact-SQL 编辑器随即出现,并显示可用于更新目标以匹配源的脚本。

将同步脚本保存到文件中

  1. 在**“数据”菜单上,指向“架构比较”,再指向“导出到”,然后单击“文件”**。

    此时将显示**“保存更新架构脚本”**对话框。

  2. 在**“对象名”中,键入要指定给同步脚本的名称,然后单击“保存”**。

    此时会用指定的文件名保存该脚本。

同步数据库或服务器对象

比较完源与目标的架构后,可以同步整个架构或仅同步在此架构中指定的数据库对象。 有关更多信息,请参见比较和同步数据库架构

如果源和目标位于同一台服务器上,则当您尝试同步架构时可能会出现错误。 导致出现此错误的原因是,无法使用与源文件相同的名称来创建目标文件(如文件组文件),因为这些文件在服务器上已存在。 若要解决此问题,请为发生冲突的文件将**“更新操作”更改为“跳过”**。

提示

比较的数据库分别称为“源”和“目标”。 同步数据库架构时,将更新目标,而源保持不变。 虽然可以将一个项目文件 (.dbschema) 指定为目标,但无法更新项目文件。

更新目标架构

  1. 比较两个架构。

    完成比较之后,**“架构比较”**窗口将列出已比较的数据库对象。 每一行代表一个数据库对象。

  2. (可选)在**“更新操作”**列中,指定是对结果列表中的每个对象应用还是跳过此更新。

    单个同步操作不会立即执行,而是存储起来,在后面的步骤中成批执行。

    提示

    若要针对特定类型的所有对象重置“更新操作”列,请右击该类型的节点(例如,“表”节点),再单击“还原默认值”。 若要将特定类型的所有对象的“更新操作”列设置为某个特定状态,请右击该类型的节点,再单击“全部创建”“全部更新”“全部跳过”

  3. 若要同步不同的、缺少的或新的数据库对象,请执行下列操作之一:

    • 若要立即更新目标,请单击**“写入更新”**。

      除了标记为**“跳过”**的对象外,此选项将源中的所选数据库对象的架构应用于目标中的相应对象。 此同步操作意味着更新、创建或删除目标对象。

      重要说明重要事项

      更新架构时,可以通过单击“停止写入目标”来取消更新操作。 如果停止更新,将不会传播大多数对象类型的更改。 但是,由于“用户”和“角色”对象无法包装在事务中,对这些对象所做的部分更改可能无法回滚。

    • 若要在更新目标之前查看更改,请使用**“架构更新脚本”窗口,或单击“导出到编辑器”**。

      此选项会生成一个 Transact-SQL 脚本,并在 Transact-SQL 编辑器窗口中打开该脚本。 在对目标运行该脚本之前,可以查看并根据需要修改该脚本。 生成的 Transact-SQL 脚本与单击**“写入更新”**时所运行的脚本相匹配。

      提示

      “写入更新”操作完成后,Visual Studio 不会自动刷新“架构比较”窗口中显示的结果, 而是会通过更新状态栏来建议您单击“刷新”。 此行为为您提供了重新比较架构的选择,如果架构较大,该重新比较操作可能花费较长时间。

    • 若要将所做的更改保存到一个文件中,而不在 Transact-SQL 编辑器中查看这些更改,请单击**“导出到文件”**。

      此选项会生成一个 Transact-SQL 脚本,并用指定的文件名保存此脚本。 生成的脚本与单击**“写入更新”**时所运行的脚本相匹配。 如果另一个用户稍后将用您提供的脚本更新目标,或者必须由另一个用户对此脚本进行其他更改,则您可能会采用此方法。

使用 VSDBCMD.EXE 比较架构

您可能需要为您无权访问的数据库生成一个部署脚本。 如果您具有要部署的项目的 .dbschema 文件和表示目标数据库的当前状态的 .dbschema,则可以使用 VSDBCMD.EXE 完成此任务。 如果您没有目标架构,则可以要求您的数据库管理员使用本节中的第二个过程导入目标架构。

您可以在包含 VSDBCMD.EXE 工具和支持文件的任意计算机上执行这两个过程。 可以在下面的文件夹及其子文件夹中找到所有必需的文件:%PROGRAM FILES%\Microsoft Visual Studio 10.0\VSTSDB\Deploy。 有关更多信息,请参见 有关 VSDBCMD.EXE 的命令行参考(部署和架构导入)

在命令提示符处比较架构

  1. 打开命令提示。

  2. 将文件夹更改为包含 VSDBCMD.EXE 的文件夹。

  3. 在命令提示符处,键入以下命令:vsdbcmd.exe /a:deploy /dd:- /dsp:sql /model:ProjectName.dbschema /targetmodelfile:TargetDatabase.dbschema /DeploymentScriptFile:OutputFilename.sql /p:TargetDatabase="TargetDatabaseName"

    将 ProjectName 替换为通过生成数据库项目创建的 .dbschema 文件的名称。 将 TargetDatabase 替换为包含目标数据库架构的 .dbschema 文件的名称。 将 OutputFilename 替换为您希望指定给部署脚本的名称。 将 TargetDatabaseName 替换为您希望更新的数据库的名称。

    提示

    如果您希望包括数据库项目中的部署前和部署后脚本,则可向命令行中添加一个参数:/ManifestFile:ProjectName.deploymanifest。 您可以在项目文件夹下的 sql 文件夹的子文件夹中找到 .deploymanifest 文件。

  4. 现在,您可以使用 OutputFilename.sql 文件部署目标服务器的更新,也可以要求您的数据库管理员这样做。

导入目标架构

  1. 打开命令提示。

  2. 浏览到包含 VSDBCMD.EXE 的文件夹。

  3. 在命令提示符处,键入以下命令:vsdbcmd.exe /a:Import /dsp:sql /model:TargetDatabase.dbschema /cs:ConnectionString

    将 TargetDatabase 替换为您要从目标数据库导入的 .dbschema 文件的名称。 将 ConnectionString 替换为用于连接到目标数据库的连接字符串。 例如,您可以指定 /cs:"Data Source=MyServer/SQL2K8;Integrated Security=True;Pooling=False;Initial Catalog=MyDatabase"。

    完成此命令后,即创建了 .dbschema 文件。 该文件包含从中导入它的数据库的架构定义。 有关更多信息,请参见如何:从命令提示符处导入架构有关 VSDBCMD.EXE 的命令行参考(部署和架构导入)

请参见

任务

如何:比较并同步两个数据库的数据

概念

比较和同步数据库架构

修订记录

日期

修订记录

原因

2010 年 7 月

添加了有关如何从命令提示符处使用 VSDBCMD.EXE 比较架构的信息。

客户反馈