Visual Studio 数据库项目重命名列

Posted

技术标签:

【中文标题】Visual Studio 数据库项目重命名列【英文标题】:Visual Studio DataBase Project rename a column 【发布时间】:2015-09-14 14:47:39 【问题描述】:

我有一个 Visual Studio 数据库项目,关于此类项目的文档似乎很少且粗略。

问题:我想重命名一列。

问题:我要重命名列的表中有数据,所以每次我生成脚本时,我都会得到这段代码,导致脚本因为表中有数据而崩溃。

 IF EXISTS (select top 1 1 from [dbo].[res_file_submission])
RAISERROR (N'Rows were detected. The schema update is terminating because data loss might occur.', 16, 127) WITH NOWAIT

我不知道如何解决这个问题,我真的不相信删除这一行是答案,我已取消选择“如果可能发生数据丢失,则阻止增量部署”选项,但这似乎又没有区别。

更新:该列有一个约束,这似乎是原因。

【问题讨论】:

您是否突出显示了该列并对其进行了重构重命名(Ctrl+R,默认为 R)?那应该只是在列和相关对象上发出一个 sp_rename ,而不会给您带来太多的悲伤。听起来好像您的脚本正在尝试重新创建表或类似的东西。当您选择生成脚本时,实际的脚本是什么样的? 只是为了放大这个响应,当您使用重构时,每个更改的条目都会添加到 refactor.log 文件中——这会触发 sp_rename,如果没有它,它将删除旧列。 【参考方案1】:

您可以使用命令(重命名查询)在构建后部署脚本中简单地重命名列名。它将允许您更改列的名称,并且不会损害该表中的数据。

【讨论】:

【参考方案2】:

您可以通过部署前和部署后脚本处理此问题。

创建一个预部署脚本来备份表并删除其数据:

if (OBJECT_ID('TempDB..#MyTableBackup') is null)
begin
    -- backup data to a temp table
    SELECT *
    INTO #MyTableBackup
    FROM MyTable

    -- TODO: If you have foreign key constraints that reference MyTable, you'll need to disable them here.

    -- delete the data in your table
    DELETE MyTable
end

创建一个恢复数据的部署后脚本:

-- TODO: Only include the SET IDENTITY_INSERT lines if your table has an identity column
--SET IDENTITY_INSERT MyTable ON

INSERT MyTable
SELECT *
FROM #MyTableBackup

--SET IDENTITY_INSERT MyTable OFF

-- TODO: If you disabled foreign key constraints in the pre-deployment script, enable them here.

DROP TABLE #MyTableBackup

由于部署前脚本清空了您的表,因此在部署的常规部分中会发生列重命名,而不会收到“阻止增量部署...”警告。

确保在部署成功后从项目中删除这些脚本,以便在下次部署期间不会重新运行它们。

【讨论】:

【参考方案3】:

问题不在于我无法重命名列,而是我需要重命名列然后部署重命名,而比较脚本一直阻止重命名。

解决方案:重命名数据库项目中的列,包括对它的引用,然后在我的目标上的预部署脚本中添加一个脚本以执行相同的名称更改。然后在我的数据库上运行预部署脚本来更新它,然后运行比较,现在将不包括列重命名,因为目标和源具有相同的名称。

【讨论】:

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

在迁移中使用 postgreSQL 重命名列

从 Ext JS 4.1 中的列菜单重命名列标题

Laravel 重命名列丢失所有数据

按列索引熊猫数据框重命名列

如何按列索引重命名列?

在 Athena 中重命名列