在部署过程和架构更新过程中保留数据时的注意事项

更新:2007 年 11 月

在对两个架构进行同步之前,应当考虑对数据库项目的设置进行配置,以便尽可能防止因更改而丢失宝贵的数据。通过配置这些设置,当同步内容中包含可能会从目标数据库中移除数据的更改时,可以阻止这样的同步。有关更多信息,请参见如何:在部署到现有数据库期间控制数据丢失如何:设置比较数据库架构的选项

但是,此设置可能会产生意外的结果。在某些情况下,即使不丢失宝贵数据,也会禁止部署所做的更改。在其他情况下,即使 SQL Server 可能会导致数据在更新目标时丢失,该设置也允许部署所做的更改。

不必要地阻止了部署

如果您将项目设置配置为帮助防止数据丢失,那么,即使宝贵数据不会丢失,也可能无法对两个架构进行同步。例如,您可能会删除一个数据库项目中的某列数据,并尝试将该更改部署到目标数据库。即使该列是有意删除的,也将阻止进行部署,以防目标数据库上的数据丢失。

另一个示例是,如果经验证,源对象中的数据类型与目标对象中的等效数据类型不兼容,则将禁止进行部署。如果源对象或目标对象中包含用户定义的数据类型或公共语言运行库 (CLR) 类型,可能会出现这种情况。例如,如果源对象中的数据类型定义为 char(100),目标对象中的数据类型定义为用户定义的数据类型(如:CREATE TYPE [架构].[用户定义的数据类型] FROM char(100) NOT NULL),则将禁止进行部署。

如有必要,可以临时配置项目设置,以便允许在检查部署或更新脚本之后进行同步并确认所做的更改不会导致宝贵数据丢失。

在执行未阻止的部署过程中数据丢失

在某些情况下,即使您将数据库项目配置为帮助防止数据丢失,SQL Server 也可能会导致数据在执行同步的过程中丢失。在同步两个架构之前,应当检查部署或更新脚本中是否有可能包含以下更改:

  • 对表中列的顺序进行了更改。

  • 对列数据类型进行了更改,更改后的数据类型与现有数据类型不兼容而且使用 SQL Native 数据类型。如果数据类型更改(例如,int 更改为 bit,或者 nvarchar(100) 更改为 char(10))会导致数据截断,可能会出现这种情况。

  • 对列的属性(如列的标识)进行了更改。

  • 对表中标识列的属性(如标识种子)进行了更改。

  • 对不允许使用 NULL 值且没有相关默认值的列进行了更改(例如,将某列更改为允许使用 null 值)。

  • 当表中的其他列绑定到要更改的列时,对不允许使用 NULL 值的列进行了更改。

  • 在“强制使表列顺序相同”复选框处于选中状态时,添加了一列。有关更多信息,请参见选项(数据库工具/架构比较)

  • 对表的文件组进行了更改。

如果部署脚本或更新脚本中包含这些类型的更改,则可以手动修改该脚本以保留数据。

请参见

任务

如何:在部署到现有数据库期间控制数据丢失

如何:将更改部署到新数据库或现有数据库

如何:设置比较数据库架构的选项

如何:同步数据库架构

概念

Database Edition 术语概述