ChatGPT解决这个技术问题 Extra ChatGPT

Sql Server“不允许保存更改”错误►防止保存需要重新创建表的更改

当我在 SQL Server 中创建表并保存它时,如果我尝试编辑表设计,例如将列类型从 int 更改为 real,我会收到此错误:

不允许保存更改。您所做的更改需要删除并重新创建下表。您要么对无法重新创建的表进行了更改,要么启用了阻止保存需要重新创建表的更改的选项。

为什么我必须重新创建表?我只想将数据类型从 smallint 更改为 real

桌子是空的,我直到现在才使用它。


C
Community

Save (Not Permitted) Dialog Box on MSDN

保存(不允许)对话框警告您不允许保存更改,因为您所做的更改需要删除并重新创建列出的表。以下操作可能需要重新创建表: 在表的中间添加新列 删除列 更改列的可空性 更改列的顺序 更改列的数据类型 <<<< 更改此选项,在工具菜单上,单击选项,展开设计器,然后单击表和数据库设计器。选中或清除阻止保存需要重新创建表的更改复选框。

另请参阅 Colt Kwong 博客条目:
Saving changes is not permitted in SQL 2008 Management Studio


SSMS 不应该让你在没有事先警告的情况下做一些不安全的事情。但是手头有备份,以防万一。
此选项告诉 SSMS 它可以继续在新模式中创建临时表,将数据复制到其中,然后删除旧表并将临时表重命名为原始名称。在交易中应该做的一切都很好,但是关系会被打破并重新创建,所以如果不是 100% 那么可能会做一些意想不到的事情。
不知道为什么我不记得那些简单的步骤来下拉这个选项,我一直在寻找解决方案。嘿嘿嘿嘿。谢啦!
圣牛-您可以将其关闭以克服此错误?我不知道这一点,在过去的 3 年中,我一直担心在不经意间设计一个没有身份规范的表并不得不创建一个新表。很棒的提示!
这是 Microsoft 关于禁用“防止保存更改...”选项的 CAVEAT:support.microsoft.com/en-us/kb/956176。基本上,如果这是您使用的功能,您可能会丢失更改跟踪等元数据。
y
ypercubeᵀᴹ

你使用 SSMS 吗?

如果是,请转到菜单工具>>选项>>设计器并取消选中“防止保存需要重新创建表的更改”


@NeilMeyer 请注意,那里的复选框被选中是有原因的。这是一种安全措施,可防止删除和重新创建表的操作(从而丢失所有数据!因此,请谨慎使用!
如果像这样重新创建表,表之间的关系会丢失吗?
@NeilMeyer 不确定 SSMS 会产生什么确切的声明。它也可能会重新创建任何丢弃的 FK。
当您禁用此选项时,甚至没有任何警告是多么愚蠢。
这并不愚蠢,因为您几乎没有丢失任何重要物品的风险。上面的 ypercube 是错误的,您不会丢失任何数据。它确实会删除旧表并为您创建一个新表,但它会确保保留所有数据。唯一的问题可能是,如果您以这种方式编辑了一个包含数亿行的非常大的表格,则可能需要一两个小时才能保存您的更改
W
WonderWorker

防止保存需要重新创建表的更改 五次快速单击 工具 选项 设计器 防止保存需要重新创建表的更改 确定。保存后,重复该程序以重新勾选该框。这可以防止意外的数据丢失。

进一步说明

默认情况下,SQL Server Management Studio 会阻止删除表,因为删除表时其数据内容会丢失。*

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

*您的具体情况不会造成任何后果,因为您的桌子是空的。我提供此解释完全是为了提高您对程序的理解。


这是错误的。当您编辑这样的表并且其中包含数据时,数据不会丢失。将创建新表,其中包含原始表中的所有数据。
还将维护任何索引、默认值、约束、触发器等。根据 Microsoft 文档,您唯一会失去的是更改跟踪,这是一项很少有人使用或启用的功能。 docs.microsoft.com/en-US/troubleshoot/sql/ssms/…
I
Irshad Ahmed Akhonzada

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

打开 Microsoft SQL Server Management Studio 2008 单击工具菜单 单击选项 选择设计器 取消选中“防止保存需要重新创建表的更改” 单击确定

https://i.stack.imgur.com/7oWB5.png


M
Martijn Pieters

要更改阻止保存需要重新创建表的更改选项,请执行以下步骤:

打开 SQL Server 管理工作室 (SSMS)。在工具菜单上,单击选项。

在选项窗口的导航窗格中,单击设计器。

选中或清除阻止保存需要重新创建表的更改复选框,然后单击确定。

注意:如果禁用此选项,则在保存表时不会警告您所做的更改已更改表的元数据结构。在这种情况下,保存表时可能会发生数据丢失。

https://i.stack.imgur.com/bx2gs.png


表格设计器很方便,但你不能用它实现一切
R
Rizwan Gill

这是一个非常简单的设置问题,通过以下步骤可以在 5 秒内修复

为了让您在更改表后保存更改,请按照以下步骤进行 sql 设置:

打开 Microsoft SQL Server Management Studio 2008 单击工具菜单选项,然后单击选项选择设计器取消选中“防止保存需要重新创建表的更改”选项单击确定尝试更改您的表您的更改将按需要执行


这如何以任何方式增加接受的答案?
A
Andrew Barber

继续位于顶部菜单的工具。从下拉菜单中选择选项。您现在有一个弹出窗口,选择位于菜单左侧的 Designers 选项。取消选中选项阻止保存需要重新创建表的更改。单击确定按钮。


W
WonderWorker

取消勾选 工具 ► 选项 ► 设计器 选项卡中的 Prevent saving changes that require table re-creation 框。

SQL Server 2012 示例:

https://i.stack.imgur.com/MBGSp.jpg


P
Panther

复制自 this link " ... 重要我们强烈建议您不要通过关闭阻止保存需要重新创建表的更改选项来解决此问题。有关关闭此选项的风险的详细信息,请参阅“更多信息”部分。''

" ...要解决此问题,请使用 Transact-SQL 语句更改表的元数据结构。有关其他信息,请参阅 SQL Server Books Online 中的以下主题

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

更改表 MyTable 更改列 MyDate7 日期时间 NULL "


有这么多答案都说同样的话,这就是我一直在寻找的答案,因为我的表中有实时数据,我不想丢失。我需要将小数列从小数点 0 位更新到小数点后 2 位,并且简单的 alter 语句完美运行!
这里的悲剧是 SSMS 应该在幕后完全做到这一点,因此不需要丢弃桌子
引用 MS 的建议不这样做是荒谬的,但没有解释原因。我不使用它的原因有两个: 1:我的表太大以至于删除和重新创建它的操作需要几个小时,因此最好将它作为不依赖 SSMS 的作业在一夜之间运行。 2:我在桌子上使用更改跟踪。在安全关闭的情况下使用 SSMS“编辑表”功能唯一会丢失的是更改跟踪。
G
Gellie Ann

以防万一这里有人也没有注意(比如我):

对于 Microsoft SQL Server 2012,在选项对话框中,有一个偷偷摸摸的小复选框,显然隐藏了所有其他设置。虽然我不得不说我一直想念那个小怪物!!!

之后,您可以继续执行步骤,设计师,取消选中防止保存等等等等。

https://i.stack.imgur.com/qAO6X.png


h
halfer

工具>>选项>>设计器并取消选中“防止保存需要重新创建表的更改”:

https://i.stack.imgur.com/TmBv8.png


R
Rishabh Seth

1) 打开顶部的工具。 2) 从 Picklist 中选择选项。 3) 现在出现弹出窗口,您现在可以从左侧菜单列表中选择设计师选项。 4)现在防止保存更改需要取消选中需要重新创建的表。现在单击确定。


O
Ogbonna Vitalis

从“工具”菜单中,单击“选项”,从侧面菜单中选择“设计器”,然后取消选中“防止可能导致重新创建表格的更改”。然后保存更改


T
Taher Chtaywi

如果您使用 sql server Management Studio,请转到工具>>选项>>设计器并取消选中“防止保存需要重新创建表的更改”它适用于我


这只是许多现有答案的重复。
E
Emre Karataşoğlu

如果您在类似 The image 的列表中看不到“防止保存需要重新创建表的更改”

您需要启用更改跟踪。

右键单击您的数据库,然后单击属性

单击更改跟踪并使其启用

再次转到工具 -> 选项 -> 设计器并取消选中它。


A
Ahmad Pujianto

实际上,您被 SSMS 而不是 SQL Server 阻止。

解决方案是更改 SSMS 的设置或使用 SQL 查询。

使用 SQL 查询,您可以自由地进行更新。示例您要向表中添加新列,您可以这样做:

ALTER TABLE 客户添加电子邮件 varchar(255) NOT NULL DEFAULT 'OK';

其他选项是更改 SSMS 设置。请参考其他答案,正如许多人所解释的那样。


如果您能说出 SSMS 阻止该操作的原因以及应该更改哪些设置,这将对未来的用户有所帮助。
SSMS 会阻止操作以确保安全,因为如果它没有阻止操作,您可能会丢失对表的更改跟踪,或者操作可能需要很长时间才能完成。如果您对这两个事实都满意,那么您可以在禁用安全开关的情况下安全地使用 SSMS 中的“编辑表”功能。