我在SQL Server Management Studio表设计器的现有表中添加了一个新列。输入INT,而不是null。 没有设置默认值。
我生成了一个更改脚本并运行它,它出错并警告新列不允许空值,并且没有设置默认值。它说" 0行受影响"。
数据仍然存在,出于某种原因,我的新专栏在"列" SSMS左侧数据库树上的文件夹,即使它表示" 0行受影响"并且未能使数据库发生变化。
因为新列在列表中可见,我想我会继续更新所有行并添加值。
UPDATE MyTable SET NewColumn = 0
Boom ..桌子擦干净了。删除每一行。
这是一个很大的问题,因为它出现在一个生产数据库上,而这个数据库并没有被我不知情地备份。但是......可以通过一些手动输入来恢复,所以不是世界末日。
任何人都知道这里可能发生了什么......也许内部发生的事情可能导致我的更新声明消灭了表格中的每一行?
答案 0 :(得分:2)
UPDATE
语句不能删除行,除非之后有一个触发器执行删除,并且表示该表没有触发器。
所以它必须是我在评论中为您准备的场景:行没有正确加载到新表中,旧表被删除。
请注意,它甚至可以让看起来适合您,其中行确实在某一点加载 - 如果事务未提交,然后(例如)稍后当会话终止时,事务会自动回滚。该交易也可能因其他原因而被回滚。
另外,我的订单可能不正确:它可能会以新名称创建新表,加载行,删除旧表,然后重命名新表。在这种情况下,您可能一直在查询错误的表以查明数据是否已加载。我现在不记得我的头顶现在桌面设计师的脚本是哪种方式 - 这种猫的皮肤不止一种。