SQL Server“无法保存更改”错误 ► 防止保存需要重新创建表的更改

942
在SQL Server中创建表并保存后,如果我尝试编辑表设计,如将列类型从int更改为real,则会出现以下错误:
保存更改不被允许。您所做的更改需要删除并重新创建以下表。您已经对无法重新创建的表进行了更改或启用了防止保存需要重新创建表的更改选项。
为什么我必须重新创建表呢?我只是想将数据类型从smallint更改为real。
该表为空,并且我还没有使用它。

15个回答

1732

来自MSDN上的“保存(不允许)”对话框

保存(不允许)对话框会警告您,由于所做的更改需要删除并重新创建列出的表格,因此不允许保存更改。

以下操作可能需要重新创建表格:

  • 在表格中间添加新列
  • 删除列
  • 更改列的可空性
  • 更改列的顺序
  • 更改列的数据类型 <<<<

要更改此选项,请在工具菜单上,单击选项,展开设计器,然后单击表格和数据库设计器。 选择或清除防止保存需要重新创建表格的更改复选框。

另请参见 Colt Kwong博客文章:
在SQL 2008管理工具中不允许保存更改


7
SSMS 不应该让你在未先发出警告的情况下执行不安全的操作。但是,最好备份一下以防万一。 - Robert Harvey
53
此选项告诉SSMS可以在新的模式下创建临时表,将数据复制到其中,然后删除旧表并将临时表重命名为原始名称。这样做没有问题,因为应该是在事务中完成的,但是关系将被破坏和重新创建,所以如果不是100%确定,则可能会出现意外情况。 - Justin King
19
不知道为什么我总是记不住下拉选项的简单步骤,每次都得搜寻解决方案。呵呵呵呵。谢谢啊! - NoWar
8
天啊!- 你只需要关闭它就可以避免这个错误吗?我不知道,过去三年一直担心无意中设计一个没有标识规范的表格,必须创建一个新表。太棒了,这个提示! - Shawn J. Molloy
8
这是微软关于禁用“防止保存更改...”选项的注意事项:https://support.microsoft.com/zh-cn/kb/956176,如果您使用“修订功能”等元数据,您可能会失去这些信息。 - Baodad
显示剩余9条评论

307

如果您正在使用SSMS:

请转到菜单工具 >> 选项 >> 设计师,取消勾选防止保存需要表重新创建的更改


7
请注意,该复选框被选中是有原因的。这是一项安全措施,旨在防止操作导致表被删除并重新创建(从而丢失所有数据!),因此请谨慎使用! - ypercubeᵀᴹ
如果以这种方式重新创建表,表之间的关系会丢失吗? - Neil Meyer
1
@NeilMeyer 不确定 SSMS 会生成什么确切的语句。它可能会重新创建任何已删除的 FK。 - ypercubeᵀᴹ
现在禁用这个选项甚至没有任何警告,这太愚蠢了。 - ESP32
6
这并不是愚蠢的,因为你几乎没有失去任何重要的东西的风险。ypercube上面说错了,你不会丢失任何数据。它确实会删除旧表并为您创建一个新表,但它会确保保留所有数据。唯一的问题可能是,如果您以这种方式编辑了一个有数亿行的非常大的表格,可能需要花费一两个小时来保存您的更改。 - Geoff Griswald

106

防止保存需要重新创建表格的更改

五个简单点击

在五次点击中防止保存需要重新创建表格的更改

  1. 工具
  2. 选项
  3. 设计师
  4. 防止保存需要重新创建表格的更改
  5. 确定

在保存后,重复该过程以重新勾选框。这可防止意外数据丢失。

进一步解释

  • 默认情况下,SQL Server Management Studio会防止删除表格,因为当表格被删除时,其数据内容将丢失*。

  • 在表格设计视图中更改列的数据类型时,在保存更改时,数据库会内部删除表格,然后重新创建一个新表格。

*由于您的表格为空,因此您的具体情况不会造成影响。我提供这个解释完全是为了提高您对此过程的理解。


4
编辑表格时,如果其中包含数据,则不会丢失数据。新表格将被创建,其中包含原始表格中的所有数据。但是,请确保您正在使用正确的编辑方法。 - Geoff Griswald
1
任何索引、默认值、约束、触发器等都将被保留。根据微软文档,您唯一会失去的是变更跟踪功能,这是很少有人使用或启用的功能。https://learn.microsoft.com/en-US/troubleshoot/sql/ssms/error-when-you-save-table - Geoff Griswald

55

这可以在Microsoft SQL Server中轻松更改。

  1. 打开 Microsoft SQL Server Management Studio 2008
  2. 单击“工具”菜单
  3. 单击“选项”
  4. 选择“设计人员”
  5. 取消选中“防止保存需要重新创建表的更改”
  6. 单击“确定”

插入图像描述


34
要更改“防止保存需要重新创建表格的更改”选项,请按照以下步骤操作:
1. 打开 SQL Server Management Studio(SSMS)。 2. 在“工具”菜单上,单击“选项”。 3. 在“选项”窗口的导航窗格中,单击“设计人员”。 4. 选择或清除“防止保存需要重新创建表格的更改”复选框,然后单击“确定”。
注意:如果禁用此选项,则在保存表格时,您不会收到警告提示,以指出所做的更改已更改了表格的元数据结构。在这种情况下,当您保存表格时可能会发生数据丢失。
图片链接:enter image description here

表格设计器很方便,但并不能实现所有功能。 - Sitecore Sam

23

这个设置问题非常简单,只需要按照以下步骤进行操作即可,在5秒钟内解决。

为了允许您在修改表格后保存更改,请按照以下步骤进行 SQL 设置:

  1. 打开 Microsoft SQL Server Management Studio 2008
  2. 点击 工具 菜单选项,再点击 选项
  3. 选择 设计者
  4. 取消选中“防止保存需要重新创建表格的更改”选项
  5. 点击确定
  6. 尝试修改您的表格
  7. 您的更改将会按照您的期望执行

10
这如何在任何方面补充接受的答案? - Immortal Blue

18

在顶部菜单中选择工具
从下拉菜单中选择选项。现在你有一个弹出窗口,选择左侧菜单块上的设计师选项。取消选择防止保存需要重新创建表格的更改选项。单击“确定”按钮。


15

取消选中 工具 ► 选项 ► 设计人员 选项卡中的 防止保存需要重新创建表的更改 复选框。

SQL Server 2012 示例:

输入图像描述


12

此链接复制:

重要提示:我们强烈建议您不要通过关闭“防止需要重新创建表才能保存更改”选项来解决此问题。有关关闭此选项的风险的详细信息,请参见“详细信息”部分。

解决此问题的方法是使用Transact-SQL语句对表的元数据结构进行更改。有关详细信息,请参见SQL Server Books Online中的以下主题。

例如,要将名为MyTable的表中类型为datetime的MyDate列更改为接受NULL值,可以使用以下命令:

alter table MyTable alter column MyDate7 datetime NULL "


2
由于有很多答案都在说同样的事情,这个回答是我一直在寻找的,因为我在表格中有实时数据,我不想失去它们。我需要将一个小数列从0位小数更新为2位小数,简单的alter语句完美地解决了这个问题! - stitz
这里的悲剧是SSMS应该在幕后做到这一点,因此不需要删除表。 - m12lrpv
荒谬的是引用微软的建议不要这样做,却没有解释为什么。我不会使用它有两个原因:1:我的表非常大,删除和重新创建操作需要花费数小时,所以最好作为一个不依赖于SSMS的作业在夜间运行。2:我正在使用表上的更改跟踪。使用SSMS“编辑表”功能时关闭安全性唯一会失去的就是更改跟踪。 - Geoff Griswald
最近的“MSDN”链接:https://learn.microsoft.com/en-us/troubleshoot/sql/ssms/error-when-you-save-table - Hans Kesting

7

如果有人和我一样没有注意到以下内容,请注意:

对于Microsoft SQL Server 2012,在选项对话框中,有一个非常隐蔽的复选框,显然隐藏了所有其他设置。尽管我必须承认,我一直错过了这个小东西!!!

在那之后,您可以继续进行步骤,设计师,取消选中“防止保存”等等...

sneaky_check_box_in_option


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