Visual studio 2013 Visual Studio 2013数据库项目下拉列

Visual studio 2013 Visual Studio 2013数据库项目下拉列,visual-studio-2013,database-project,Visual Studio 2013,Database Project,当datatable中有数据行时,有人知道从数据库中删除现有列的最佳方法吗 我尝试的似乎不起作用。我在数据库项目中包含了一个预部署脚本 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 Co

当datatable中有数据行时,有人知道从数据库中删除现有列的最佳方法吗

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

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;    

您只需要在项目中执行一次(而不是在预部署脚本中),发布时,需要使用“允许数据丢失”选项。如果你删除一个列,我看不出有办法避免可能的数据丢失。完成后,您可以随时更改设置。

我知道这是一个旧线程,但我在遇到相同问题时遇到了这个问题。。有人可能仍然会受益

以下是对我有效的方法:

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

然后单击“高级…”按钮打开“高级发布设置”

1) Uncheck - 'Block incremental deployment if data loss might occur' checkbox.
2) Check - 'DROP objects in target but not in project'
点击OK按钮。 然后单击Generate Script按钮以生成发布脚本


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

您需要修改数据库项目属性

  • 转到项目属性
  • 调试选项卡
  • 取消选中此选项“如果可能发生数据丢失,则阻止增量部署”,如下图所示
  • 在我的情况下

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

  • 模式比较选项(菜单条中的小齿轮图标)
  • 转到“常规”选项卡
  • 取消选中可能丢失的数据块

  • 在会话期间,这将保持未检查状态。我没有确认退出会话时它是否保持选中状态。

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

    预部署脚本示例:

    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
    
    然后数据库项目将从数据库中删除要删除的列

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

    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
    

    如果可能发生数据丢失,并且我仍然收到相同的错误,则可能重复尝试取消选中块增量部署。生成执行此操作的脚本时会发生什么情况?您可以发布该脚本或脚本中试图删除该列的相应部分吗?我以前用SSDT做过类似的事情,除非选中了“不允许数据丢失”选项,否则没有出现此问题。。。我先删除了它,然后删除了这个专栏,它成功了。然而,下一个问题是,如果它不是默认约束,而是其他类型的约束,该怎么办。有没有一种方法可以删除给定列上的所有约束?我不认为有一种简单的方法可以像重命名列那样做到这一点。我知道,如果您删除该列,那么如果在同一数据库中存在依赖项,那么您的项目构建将完全失败。它们还应显示在错误/警告消息中。您可以双击这些文件以转到相应的文件,并注释掉约束或删除其.Wierd的文件/文本,因此我使用了预部署脚本来删除列,因为我必须先删除默认约束,然后再删除列。如果可能发生数据丢失,我有块增量部署“未经检查。我仍然得到原问题中所述的错误。高级部分中是否有其他设置会导致此问题???但是柱子掉了!不知道为什么要加入预部署脚本。项目应该在发布该列时删除该列,但由于该列已被删除而无法找到该列可能会让您感到不适。执行工作的脚本是在实际运行部署前/部署后脚本之前生成的;因此,发布操作将尝试删除脚本中的列。尝试从预部署脚本中删除“drop column”操作,并在发布时选择“生成脚本”,而不是直接推送更改。因此,实际上可以从项目的两个属性控制此选项,发布设置呢?但当将列的大小从nvarchar-5减少到nvarchar-3时,我遇到了另一个问题或错误,将数据放入列中。表[dbo].[tblUsers]中的列vs_列的类型当前为nvarchar(5)NULL,但正在更改为nvarchar(3)NULL。可能会发生数据丢失。但在将列的大小从nvarchar-5减小到nvarchar-3时,我遇到了另一个问题或错误,因为将数据放入了列中。表[dbo].[tblUsers]中的列vs_列的类型当前为nvarchar(5)NULL,但正在更改为NVARCHAR(3)NULL。可能会发生数据丢失。如果要求只是删除一列,为什么需要指定#2?依我看,第二次是有风险的。