VS 2010数据库项目更改列名会丢失数据

4
我正在测试 Visual Studio 2010 的新数据库项目功能,并想要更改表中列的名称。我在创建脚本中更改了名称并将其部署到数据库上。生成的脚本只是删除了该列并添加了一个新的具有正确名称的列,但所有数据都丢失了。
是否有设置可以不删除列数据?
我正在寻找解决此问题的 "DataDude" 解决方案。(如果有的话)
PRINT N'Altering [dbo].[Users]...';

GO
ALTER TABLE [dbo].[Users] DROP COLUMN [TestX];

GO
ALTER TABLE [dbo].[Users]
    ADD [Testn] NVARCHAR (50) NULL;

GO

谢谢,Keith
3个回答

7

点击视图 -> 数据库模式视图,使用模式视图。

展开表及其列。

右键单击列,选择“重构” -> “重命名...”。

在“新名称”字段中更改名称,并选中“预览更改”框。

请注意,它不仅会更改列名称,还可能引用该列的存储过程也会被更改。

在数据库项目中创建了一个refactorlog文件,显示名称更改信息。

在将新模式部署到现有数据库时,DataDude会查看refactorlog文件和dbo._Refactorlog表,以确定需要针对数据库处理哪些重构。

以下是使用此过程生成的代码,用于更改存储过程中引用的列名:

EXECUTE sp_rename @objname = N'[dbo].[Users].[TestF]', @newname = N'TestG', @objtype = N'COLUMN';

GO
PRINT N'Altering [dbo].[ListUsers]...';

GO
ALTER PROCEDURE [dbo].[ListUsers]

AS
    SELECT [ID], [FirstName], [LastName], [TestG]
    FROM Users
RETURN 0
GO

Keith


是的,执行重构会保持原始数据列不变。只有列名会更改。 - Keith Sirmons
当我在table.sql文件中右键单击列名时,我没有重构选项。我正在使用VS 2010 SP1。如果我选择列名并单击“数据|重构|重命名”,我会得到一个信息对话框,其中包含消息:“在模式视图中选择一个模式对象以进行重构”。有人知道为什么我在右键菜单中看不到重构选项吗? - Mark Freeman
回答自己的问题。您必须处于模式视图中,然后展开表列表,再展开表的列列表。然后,您可以右键单击列名称进行重构。 - Mark Freeman
1
值得注意的是,重构工具仅适用于VS 2010高级版及以上版本。在专业版中不存在这些工具。 - stimms

1
如果表格很小,您可以创建一个具有正确列的新表格,然后从旧表格插入到新表格中,并在进行更改时更改列。
如果表格很大,而您无法承担复制整个表格所需的时间、RAM或工作量,则可以使用以下方法: alter table add new_column,然后 update table set new_column=old_column,然后 alter table drop column old_column
当然,语法是简化的。

1
Visual Studio数据库项目处理模式更改的方式很容易导致这种混淆。对于VS来说,很难判断你是简单地重命名了一个列(应该保留数据),还是删除了列并添加了一个不同的列。我公司曾经花了很长时间开发一个数据库模式源代码控制产品,也遇到了同样的问题。
最后,我认为处理模式更改的最佳方式是 K. Scott Allen(由Jeff Atwood引用) 提出的方法。这一系列文章应该帮助你找到更好的数据库版本控制解决方案。

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