我在 SQL Server Management Studio 表设计器中向现有表添加了一个新列。类型 INT,不为空。 未设置默认值。
我生成了一个更改脚本并运行它,它出错并警告新列不允许空值,并且未设置默认值。它说“0行受影响”。
数据仍然存在,并且由于某种原因,我的新列在 SSMS 左侧数据库树上的“列”文件夹中可见,即使它显示“0 行受影响”并且无法进行数据库更改。
因为新列在列表中可见,所以我想我应该继续更新所有行并添加一个值。
UPDATE MyTable SET NewColumn = 0
繁荣.. table 擦干净了。每一行都被删除。
这是一个大问题,因为它位于生产数据库上,而该数据库在我不知情的情况下并未进行备份。但是..可以通过一些手动输入来恢复,所以不是世界末日。
任何人都知道这里可能发生了什么......也许内部发生了什么可能导致我的更新语句删除表中的每一行?
最佳答案
UPDATE
语句无法删除行,除非有一个触发器随后执行删除,并且您说该表没有触发器。
所以这一定是我在评论中为您列出的场景:行没有正确加载到新表中,并且旧表被删除。
请注意,它甚至有可能看起来适合您,其中行确实在某一点加载 - 如果事务未提交,然后(例如)稍后当您的 session 终止时,事务会自动回滚。该事务也可能因其他原因而被回滚。
此外,我可能得到的顺序不正确:它可能会以新名称创建新表,加载行,删除旧表,然后重命名新表。在这种情况下,您可能查询了错误的表以查明数据是否已加载。我现在一时记不起表格设计器是如何构造脚本的——剥这只猫的皮的方法不止一种。
关于sql-server - SQL Server 在(错误地)创建新列后删除了我的表..到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17244518/