在SQL Server Management Studio中编辑表后保存更改

309
如果我想要保存在SQL Server Management Studio中表格的任何更改(表格中没有数据),则会出现错误提示信息:

无法保存更改。您所做的更改需要删除并重新创建以下表。您已对无法重新创建的表进行了更改或启用了“防止保存需要重新创建表格的更改”的选项。

什么原因导致表格不能轻松地编辑呢?或者,SQL Server Management Studio需要重新创建表吗?这个“选项:防止保存更改”指的是什么?

关闭此选项存在风险。如果您开启了更改跟踪(表格),则可能会丢失更改。 - Chris
4
可能是SQL Server中不允许保存更改的重复问题。 - Pang
3
@Pang - 这个问题先出现了,这是重复的。 - GrandMasterFlush
1
@GrandMasterFlush https://meta.stackoverflow.com/a/252930/1402846 | https://meta.stackexchange.com/a/147651/204869 - Pang
@Pang - 我不知道,谢谢。 - GrandMasterFlush
7个回答

664

进入工具 -> 选项 -> 设计师 -> 取消选中 "防止保存需要重新创建表格的更改"。完成。

这是因为有时需要删除并重新创建一个表格才能进行更改。这可能需要一段时间,因为所有数据都必须被复制到临时表中,然后重新插入到新表中。由于SQL Server默认不信任您,您需要说“好的,我知道我在做什么,现在让我去做我的工作。”


11
微软支持网站不鼓励这样做,但如果你的表中没有任何数据,我认为没有什么危害。最好使用TSQL来进行更改。 - Jon Smock
6
个人建议不要在重要的数据库中使用设计工具。我曾多次看到它犯下昂贵的错误。此外,它也会促进懒惰的开发习惯,让一些不够熟练的人修改数据库结构,如果他们不能处理SQL代码,则可能会出现问题。 - Mark W Dickson
6
同意,马克。然而在早期开发中,我不需要写一堆脚本。 - Kristopher
13
令人震惊的是,现在已经是2016年9月了,但这个极不用户友好的错误(没有选项询问“嘿,你想允许表格更改吗?”)仍然存在。你只能看到一个“取消”按钮,接着必须得重新做一遍你的更改。这就是SQL Server最愚蠢的地方。 - Mike Gledhill
4
@Mike Gledhill 你好,来自2019年的问候,这仍然是事实 LOL。 - Captain Kenpachi
显示剩余5条评论

130

工具 | 选项 | 设计器 | 表格和数据库设计器

取消勾选选项“防止保存需要重新创建表格的更改”。


7
谢谢提供截图。我正在寻找这样的东西来帮助我找到那个愚蠢的选项。当对话框说你不能这样做时,应该有一个“仍然执行”复选框。 - Chris Benard
2
更改此选项后的最佳实践是检查上方的选项“自动生成更改脚本”,以防止数据丢失。 - dubi
谢谢提供这张图片,非常有用 :) - M A.

71

15
我的问题是:为什么SQL Server不使用必需的T-SQL语句而是在每次更改时都删除和重新创建表格?我无法理解这种行为。 - Jaime

17

16

不要取消复选框(这是一个不好的解决方案),你应该停止以那种方式编辑数据。如果必须更改数据,则应使用脚本进行更改,以便您可以轻松地将其移植到生产环境并使其受源代码控制。这也使得在将生产环境推送到开发环境后刷新测试更改更容易,从而使开发人员能够使用更新的数据进行工作。


2
A) 您可以复制SSMS生成的脚本并在生产环境中使用。 B) SSMS通常更容易、更快速、更安全,因为SSMS会为您处理所有细节。 - Trisped
2
这仍然是一个非常糟糕的想法。您不希望在生产环境中重新创建一个包含10,000,000条记录的表。这并不会更快。它有什么安全保障吗?不良数据就是不良数据,如果您使用自己编写的脚本或让SSMS编写脚本,一致性检查都能正常工作。在100%的情况下,这都是不好的做法。 - HLGEM
我认为,在任何已经在生产环境中并且其中有数据的情况下,那么是的,这可能是正确的。另一方面,在我所处的情况下,我仍在开发阶段,并且有一个完全空白的表格需要修改... 我认为不太一样。 :p - neminem

14

在SQL Server Management Studio中的表格编辑器中,许多你可以轻松可视化完成的更改实际上需要SSMS在后台删除表并从头重新创建。即使像重新排序列这样简单的事情也不能用标准的SQL DDL语句来表示,所有SSMS能做的就是删除并重新创建表。

这种操作可能a)在大型表上非常耗时,或者b)甚至由于外键约束等各种原因而失败。因此,在SQL Server 2008中,SSMS引入了其他答案已经确定的新选项。

一开始防止这种更改可能看起来有些违反直觉-在开发服务器上肯定很烦人。但在生产服务器上,这个选项及其默认值防止这种更改成为潜在的救命稻草!


2
我现在在开发服务器上,但在生产环境中,我肯定会再次打开它。再次感谢您分享经验。 - rem
2
然而,例如将 nvarchar 列的大小从 100 更改为 120 是非常简单的操作,可以使用 ALTER TABLE 轻松完成...那么,为什么 SQL Server(管理工具)在这种情况下会删除并重新创建表呢? - Jaime
4
@Jaime:你需要问那个可视化设计工具的开发者-没有其他人知道。这只是一个事实-通过可视化设计工具进行许多简单的更改通常需要重新创建表格并复制内容。如果你想采用简单的方法,那么就由你自己来处理,编写一些简单的T-SQL语句并执行它们。 - marc_s
1
谢谢@marc_s,这正是我期望的答案,虽然我对他们有一个隐藏的原因解释一切并没有太多信心 :) - Jaime
1
这个限制还可以防止对象ID在您不知道的情况下发生更改(如果您不希望发生这种情况)。 - Trisped

0

重现问题的步骤

在SQL Server Management Studio中,使用Table Designer工具创建一个包含主键的表。 右键单击包含此表的数据库,然后单击属性。 在数据库属性对话框中,单击更改跟踪。 将更改跟踪项目的值设置为True,然后单击确定。 右键单击表,然后单击属性。 在表属性对话框中,单击更改跟踪。 将更改跟踪项目的值设置为True,然后单击确定。 在工具菜单上,单击选项。 在选项对话框中,单击设计人员。 单击以选择防止保存需要重新创建表的更改复选框,然后单击确定。 在Table Designer工具中,更改现有列的允许空值设置。 尝试将更改保存到表中。

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