我正在尝试使用.sqlprojVisual Studio 2012中的数据库项目()更新维护和部署的数据库.使用SQL Server Management Studio更容易,但在这种情况下,我必须使用DACPAC进行部署.
使用DACPAC将列更改为不可为空的正确方法是什么,并且没有数据丢失的风险?
可空列添加到表中.现在我需要发布一个更新,将列设置为非null并设置默认值.由于表中有行,因此更新失败.有一个"允许数据丢失"的设置,但这不是我们的选项,此更新不应导致数据丢失.这是一个显示问题的简单示例:
CREATE TABLE [dbo].[Hello]
(
[Id] INT IDENTITY(100,1) NOT NULL PRIMARY KEY,
[HelloString] NVARCHAR(50) NULL ,
[Language] NCHAR(2) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
现在发布该数据库并添加行,HelloString中至少有一行应该为null.
将表定义更改为:
CREATE TABLE [dbo].[Hello]
(
[Id] INT IDENTITY(100,1) NOT NULL PRIMARY KEY,
[HelloString] NVARCHAR(50) NOT NULL DEFAULT 'Hello' ,
[Language] NCHAR(2) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
这不能发表.
错误:
检测到行.架构更新正在终止,因为可能会发生数据丢失.
接下来,我尝试添加预部署脚本以将所有NULL设置为"Hello":
UPDATE Hello SET HelloString = 'Hello' WHERE HelloString IS NULL
Run Code Online (Sandbox Code Playgroud)
此发布尝试也失败,但具有相同的错误.查看自动生成的发布脚本很清楚原因,但这似乎是不正确的行为.
NOT NULL变更加上之前加入默认注释中的建议(要避免此问题,必须为所有行添加此列的值)并不能解决此问题.
/*
The …Run Code Online (Sandbox Code Playgroud)