小编maf*_*fue的帖子

如何在SQL Server中使用DACPAC将可空列更新为不可为空

我正在尝试使用.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)

此发布尝试也失败,但具有相同的错误.查看自动生成的发布脚本很清楚原因,但这似乎是不正确的行为.

  1. NOT NULL变更加上之前加入默认
  2. 脚本检查任何行,是否存在空值无关紧要.

注释中的建议(要避免此问题,必须为所有行添加此列的值)并不能解决此问题.

/*
The …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 visual-studio-2012 dacpac

8
推荐指数
1
解决办法
3916
查看次数