前言
我今天正在修改 SQL Server 2008 中的一列,将数据类型从货币(18,0)更改为(19,2)。
我从 SQL Server 收到错误“您所做的更改需要删除并重新创建以下表”。
在您争先恐后地回答之前,请阅读以下内容:
我已经知道 工具-选项-设计器-表和数据库设计器-取消选中框 “防止保存需要重新创建表的更改”。 ......所以 不要 回答!
实际问题
我的实际问题是其他问题,如下所示:
这样做有什么负面影响/可能的缺点吗?
取消选中此框时,表实际上是否会自动删除并重新创建?
如果是这样,该表是否是源表的 100% 精确副本?
只有在 SQL Server 的 Management Studio 被编程为知道如何执行此操作的唯一方法时,才会删除并重新创建该表。
在某些情况下,它会在不需要时执行此操作,但也存在您在 Management Studio 中所做的编辑 不会 删除和重新创建的情况,因为它不必这样做。
问题是枚举所有案例并确定它们落在哪一边将是相当乏味的。
这就是为什么我喜欢ALTER TABLE在查询窗口中使用,而不是隐藏他们正在做的事情的视觉设计师(坦率地说有错误)——我确切地知道会发生什么,我可以为唯一可能发生的情况做准备是删除并重新创建表(这比 SSMS 对您执行此操作的频率要少一些)。
ALTER TABLE
当然。如果您可以自己编写更改脚本而不重建整个表,那就更好了 - 考虑表为 10TB 并且数据库记录大量日志(想想同步 AG、更改跟踪、复制、编写不佳的触发器)和表的情况被高度访问-这是灾难的潜在秘诀。如果您的更改是您可以应用在线提示或添加列并批量复制数据而不是 GUI 将执行的全部或全部操作,那么这会更好。
它 可能 。有一系列方案,结果取决于 SSMS 的版本、SQL Server 的版本,有时甚至是版本。您可以通过选中该框并尝试首先将更改 应用于无意义的数据库副本来进行 检查,但是使用实际的 ALTER TABLE 脚本而不是尖利的点击 GUI 是恕我直言的方法。
是的,如果 SSMS 必须重建表,它在完成后将是 100% 精确的副本(当然更改除外),但这可能是下周三。该过程创建表的新版本,将所有数据复制到其中,然后删除旧表并重命名新表。