Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 数据库项目的复杂重构和版本控制_Sql Server_Visual Studio_Version Control_Database Project_Database Versioning - Fatal编程技术网

Sql server 数据库项目的复杂重构和版本控制

Sql server 数据库项目的复杂重构和版本控制,sql-server,visual-studio,version-control,database-project,database-versioning,Sql Server,Visual Studio,Version Control,Database Project,Database Versioning,假设我有一张这样的桌子: CREATE TABLE Foo ( Id INT IDENTITY NOT NULL PRIMARY KEY, Data VARCHAR(10) NOT NULL, TimeStamp DATETIME NOT NULL DEFAULT GETUTCDATE() ); 现在让我们假设我在一个SQL Server数据库项目中构建了它,并在我的应用程序的1.0版本中发布了它。部署应用程序,并按预期使用表 对于1.1版本,产品负责人决定跟踪数据的来

假设我有一张这样的桌子:

CREATE TABLE Foo
(
    Id INT IDENTITY NOT NULL PRIMARY KEY,
    Data VARCHAR(10) NOT NULL,
    TimeStamp DATETIME NOT NULL DEFAULT GETUTCDATE()
);
现在让我们假设我在一个SQL Server数据库项目中构建了它,并在我的应用程序的1.0版本中发布了它。部署应用程序,并按预期使用表

对于1.1版本,产品负责人决定跟踪数据的来源,这将是今后的必选栏。对于数据库中已经存在的数据,如果
数据
列是数字,则他们希望
为“数字”。如果不是,则应为“未知”

数据库项目中的表现在如下所示:

CREATE TABLE Foo
(
    Id INT IDENTITY NOT NULL PRIMARY KEY,
    Data VARCHAR(10) NOT NULL,
    Source VARCHAR(10) NOT NULL,
    TimeStamp DATETIME NOT NULL DEFAULT GETUTCDATE(),
);
这很好,但部署升级将是一个问题。如果表中存在数据,这将中断。生成的脚本将创建一个临时表,将数据从旧表移动到临时表,删除旧表,并将临时表重命名为原始名称。。。但如果该表中有数据,则不会这样做,因为它将无法为不可为空的列
Source
赋值

对于琐碎的重构,重构日志会跟踪模式中的更改,并保持对已修改数据库对象的感知,但当您的手有点脏时,似乎没有办法做到这一点


如何利用数据库项目将此更改的默认脚本替换为正确捕获升级逻辑的自定义脚本?必须有某种方法来解决这个问题。

初学者,我不会在其他列的中间添加一个列。将其添加到末尾。如果列顺序对用户很重要,请在视图或代码中的其他地方屏蔽它。否则,这似乎是按设计工作的——没有办法在表中间添加一列,而不需要重建它。您可能想关闭对数据丢失的检查-我认为在这种特殊情况下,这可能会干扰架构更改。@PeterSchott您没有抓住问题的关键。重建它很好;sql被正确地生成以实现这一点。然而,丢失数据自然是可以接受的。此重构的重要、未涉及的部分是在以前不存在的列上回填数据所需的逻辑。*我的意思是“自然可以接受”_un_…您的意思是使用默认值(最好命名)创建列,并在部署后脚本中将其更新为正确的?目前,该脚本在尝试重新填充表时会失败,因为该列不可为null或没有默认值。@PeterSchott是的,这就是这个问题的内容。这将成为一个比脚本生成器支持的更复杂的操作,我看不到一种方法可以用自定义脚本覆盖自动脚本来修复它。。。但是,如果微软希望数据库项目不仅用于创建数据库,而且用于维护数据库,那么必须有一种方法。