当数据表中有数据行时,是否有人知道从数据库中删除现有列的最佳方法。
我尝试的似乎并不想工作。我在数据库项目中包含了预部署脚本
GO
if exists(select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Mercury.dbo.Discounts' and COLUMN_NAME = 'ColumnToRemove')
BEGIN
ALTER TABLE Database.dbo.Table1 Drop Column ColumnToRemove
END
GO
然后在首先创建表的脚本中,我从Create Table Script中删除了有问题的列
当执行dacpac时,我得到以下
Initializing deployment (Start)
*** The column [dbo].[Table1].[ColumnToRemove] is being dropped, data loss could occur.
Initializing deployment (Complete)
Analyzing deployment plan (Start)
Analyzing deployment plan (Complete)
Updating database (Start)
An error occurred while the batch was being executed.
Updating database (Failed)
*** Could not deploy package.
Warning SQL72015: The column [dbo].[Table1].[ColumnToRemove] is being dropped, data loss could occur.
Error SQL72014: .Net SqlClient Data Provider: Msg 50000, Level 16, State 127, Line 6 Rows were detected. The schema update is terminating because data loss might occur.
Error SQL72045: Script execution error. The executed script:
IF EXISTS (SELECT TOP 1 1
FROM [dbo].[Table1])
RAISERROR (N'Rows were detected. The schema update is terminating because data loss might occur.', 16, 127)
WITH NOWAIT;
答案 0 :(得分:49)
我知道这是一个老线程,但当我遇到同样的问题时,我遇到了这个问题。有人可能仍然会受益..
这对我有用:
右键单击VS中的数据库项目,即可获得“发布数据库”。对话。您设置目标服务器连接并选择正确的数据库。
然后点击“高级版”'按钮以打开“高级发布设置”。
1) Uncheck - 'Block incremental deployment if data loss might occur' checkbox.
2) Check - 'DROP objects in target but not in project'
单击确定按钮。 然后单击 Generate Script 按钮以生成发布脚本。
如果要经常生成脚本,可以将这些设置保存到配置文件中。
答案 1 :(得分:23)
您需要修改数据库项目属性
答案 2 :(得分:3)
在我的情况下......
在Visual Studio 2015中使用架构比较。打开架构比较窗口后:
在会话期间,这仍然未经检查。退出会话时,我没有确认是否仍然检查。
答案 3 :(得分:1)
您只需要在项目中执行一次(而不是在预部署脚本中),并且在发布时,您需要选择"允许数据丢失" 。如果你放弃一个专栏,我就没有看到可能导致数据丢失的方法。完成后,您可以随时更改该设置。