Visual Studio 2013 数据库项目下拉栏

Posted

技术标签:

【中文标题】Visual Studio 2013 数据库项目下拉栏【英文标题】:Visual Studio 2013 database project drop column 【发布时间】:2014-09-03 20:33:45 【问题描述】:

有谁知道当数据表中有数据行时从数据库中删除现有列的最佳方法。

我尝试过的似乎不想工作。我在数据库项目中包含了一个预部署脚本

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

然后在首先创建表的脚本中,我从创建表脚本中删除了相关列

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;    

【问题讨论】:

Allow (once) column drop in database project 的可能重复项 如果可能发生数据丢失,尝试取消选中阻止增量部署,但我仍然收到相同的错误 【参考方案1】:

我知道这是一个旧线程,但是当我面临同样的问题时,我遇到了这个问题.. 仍然有人可能会受益..

这对我有用:

当您在 VS 中右键单击数据库项目时,您会看到“发布数据库”对话框。您设置目​​标服务器连接并选择正确的数据库。

然后点击“高级...”按钮打开“高级发布设置”。

1) Uncheck - 'Block incremental deployment if data loss might occur' checkbox.
2) Check - 'DROP objects in target but not in project'

点击确定按钮。 然后单击 Generate Script 按钮以生成发布脚本。

如果您想频繁生成脚本,可以将这些设置保存到配置文件中。

【讨论】:

如果要求只是删除一列,为什么我们需要指定#2? IMO,#2 是有风险的。 在VS2019工作过【参考方案2】:

需要修改数据库项目属性

    转到项目属性 调试选项卡 取消勾选“如果可能发生数据丢失,阻止增量部署”选项,如下图所示

【讨论】:

所以实际上可以从项目的属性和发布设置中控制这个选项? 但是当我将列的大小从 nvarchar-5 减小到 nvarchar-3 并将数据放入列时,我遇到了另一个问题或错误表 [dbo].[tblUsers 中列 vs_column 的类型] 当前为 NVARCHAR (5) NULL,但正在更改为 NVARCHAR (3) NULL。可能会发生数据丢失。【参考方案3】:

在我的情况下......

在 Visual Studio 2015 中使用架构比较。打开架构比较窗口后:

    架构比较选项(菜单条中的小齿轮图标)。 转到常规选项卡 取消选中阻止可能的数据丢失

在会话期间保持未选中状态。我没有确认当你退出会话时它是否仍然处于选中状态。

【讨论】:

但是当我将列的大小从 nvarchar-5 减小到 nvarchar-3 并将数据放入列时,我遇到了另一个问题或错误表 [dbo].[tblUsers 中列 vs_column 的类型] 当前为 NVARCHAR (5) NULL,但正在更改为 NVARCHAR (3) NULL。可能会发生数据丢失。【参考方案4】:

如果您由于项目相关原因无法取消选中“如果可能发生数据丢失,则阻止增量部署”,您可以敲击部署前和部署后脚本以启用转换。如果您对升级表中的任何列有依赖关系,这确实会比下面复杂得多。

预部署脚本示例:

IF EXISTS (SELECT *
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'YourSchema'
    AND TABLE_NAME = 'YourTable'
    AND COLUMN_NAME = 'ColumnToBeDropped')
BEGIN

    CREATE TABLE [Upgrade].[YourTable](
        [YourTableId] [int] NOT NULL,
        [KeepThisColumn] [money] NOT NULL)

    INSERT INTO Upgrade.YourTable
    (YourTableId, KeepThisColumn)
    SELECT YourTableId, KeepThisColumn
    FROM YourSchema.YourTable

    TRUNCATE TABLE YourSchema.YourTable

END

然后数据库项目将从您的数据库中删除要删除的列。

您需要一个部署后脚本来将数据传输回真实表。部署后脚本示例:

IF EXISTS (SELECT *
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'Upgrade'
    AND TABLE_NAME = 'YourTable')
BEGIN

    SET IDENTITY_INSERT YourSchema.YourTable ON

    INSERT INTO YourSchema.YourTable
    (YourTableId, KeepThisColumn)
    SELECT YourTableId, KeepThisColumn
    FROM Upgrade.YourTable

    SET IDENTITY_INSERT YourSchema.YourTable OFF

    DROP TABLE Upgrade.YourTable

END

【讨论】:

【参考方案5】:

您只需在项目中执行一次(而不是在预部署脚本中),当您发布时,您需要使用“允许数据丢失”选项执行此操作。如果您要删除一列,我看不到解决可能的数据丢失的方法。完成此操作后,您可以随时更改该设置。

【讨论】:

当您生成一个脚本来执行此操作时会发生什么?您可以发布该脚本或尝试删除该列的脚本的适当部分吗?我以前用 SSDT 做过类似的事情,除非选中了不允许数据丢失的选项,否则我没有遇到过这个问题。 好的部分问题是放置在列上的默认约束...我先删除了它然后删除了列并且它起作用了。但是下一个问题是,如果它不是默认约束,而是其他类型怎么办。有没有办法删除给定列上的所有约束? 我认为没有像重命名列那样简单的方法。我确实知道,如果您删除该列,如果在同一个数据库中存在依赖项,那么您的项目构建应该完全失败。它们还应该出现在错误/警告消息中。您可以双击它们以将您带到相应的文件并注释掉约束或删除它的文件/文本。 奇怪,所以我使用了预部署脚本来删除列,因为我必须先删除默认约束,然后再删除列。如果可能发生数据丢失,我有块增量部署“未选中。我仍然收到原始问题中所述的错误。高级部分中是否有任何其他设置会导致这种情况???但列被删除! 不确定你为什么要加入预部署脚本。该项目应在您发布该列时将其删除,但由于该列已被删除而无法找到该列可能会让您感到不适。执行工作的脚本是在实际运行部署前/部署后脚本之前生成的;因此,发布操作将尝试删除脚本中的列。尝试从预部署脚本中删除“删除列”操作,并在发布时选择“生成脚本”,而不是直接推送更改。

以上是关于Visual Studio 2013 数据库项目下拉栏的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2013升级3没有Windows Phone项目选项?

Visual Studio 2013 数据库项目下拉栏

如何在 Visual Studio 2013 数据库项目中添加新架构

项目未显示为在Visual Studio 2013中签入TFS

如何在 Visual Studio 2012 数据库项目下的智能感知中获取表名?

Visual Studio 2013 数据库项目 - UDTT - FileStream 列问题