2

我向 SQL Server Management Studio 表设计器中的现有表添加了一个新列。键入 INT,而不是 null。 没有设置默认值。

我生成了一个更改脚本并运行它,它出错并警告说新列不允许空值,并且没有设置默认值。它说“0行受影响”。

数据仍然存在,并且由于某种原因,我的新列在 SSMS 左侧数据库树的“列”文件夹中可见,即使它说“0 行受影响”并且无法更改数据库。

因为新列在列表中可见,所以我想我会继续更新所有行并在其中添加一个值。

UPDATE MyTable SET NewColumn = 0

繁荣..桌子擦干净。每一行都被删除。

这是一个大问题,因为它位于我不知道的没有备份的生产数据库上。但是..可以通过一些手动输入来恢复,所以不是世界末日。

任何人都知道这里可能发生了什么......也许内部发生的事情可能导致我的更新语句清除表中的每一行?

4

1 回答 1

2

UPDATE语句不能删除行,除非有一个触发器在之后执行删除,并且您说该表没有触发器。

所以它必须是我在评论中为你布置的场景:行没有正确加载到新表中,旧表被删除。

请注意,它甚至有可能看起来适合您,其中行确实在某一时刻被加载 - 如果事务没有提交,然后(例如)稍后当您的会话终止时,事务会自动滚动背部。该事务也可能由于其他原因而被回滚。

另外,我的顺序可能不正确:它可能会以新名称创建新表、加载行、删除旧表并重命名新表。在这种情况下,您可能一直在查询错误的表以查明数据是否已加载。我现在想不起来表格设计者是如何构建其脚本的——给这只猫剥皮的方法不止一种。

于 2013-06-21T21:44:27.127 回答