重命名 Visual Studio 数据库项目中的列

5
我有一个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

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

更新:该列存在一个约束,这似乎是问题的原因。


3
你是否已经选中该列并执行了重构-重命名操作(默认情况下是Ctrl+R,R)?这样应该只会对该列和相关对象发出一个sp_rename指令,而不会带来太多麻烦。听起来好像你的脚本正在尝试重新创建表格或类似的操作。当你选择生成脚本时,实际的脚本长什么样子? - Peter Schott
1
仅为了强调这个回答,当您使用重构时,每个更改都会添加到refactor.log文件中 - 这会触发sp_rename操作,如果没有它,它将删除旧列。 - bigtech
3个回答

2

您可以使用“重命名查询”命令在发布后构建脚本中简单地重命名列名。这将允许您更改列的名称,同时不会损害该表中的数据。


1
问题并不在于我无法重命名该列,而是需要重命名该列并部署重命名,但比较脚本一直阻止重命名。
解决方案:在数据库项目中重命名我的列,包括对其的引用,然后在目标上添加一个脚本来执行相同的名称更改。 然后在我的数据库上运行预部署脚本以更新它,然后运行比较,此时比较将不包括列重命名,因为目标和源具有相同的名称。

1
你可以通过编写部署前和部署后的脚本来处理这个问题。
创建一个部署前的脚本来备份表格并删除其中的数据:
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

由于预部署脚本会清空您的表格,因此列重命名将在正常部署的过程中发生,而不会得到“阻止增量部署…”警告。
请务必在部署成功后从项目中删除这些脚本,以便在下一次部署期间不会重新运行它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接