Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server在(错误地)创建新列后擦除了我的表。。到底发生了什么事?_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server SQL Server在(错误地)创建新列后擦除了我的表。。到底发生了什么事?

Sql server SQL Server在(错误地)创建新列后擦除了我的表。。到底发生了什么事?,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我在SQLServerManagementStudio表设计器中的现有表中添加了一个新列。输入INT,而不是null。没有设置默认值 我生成了一个更改脚本并运行了它,它出错了,并警告说新列不允许空值,并且没有设置默认值。它说“0行受影响” 数据仍然存在,出于某种原因,我的新列在SSMS左侧数据库树上的“columns”文件夹中可见,尽管它表示“0行受影响”,并且未能更改数据库 因为新列在列表中可见,所以我想我应该继续更新所有行并在中添加一个值 UPDATE MyTable SET NewColu

我在SQLServerManagementStudio表设计器中的现有表中添加了一个新列。输入INT,而不是null。没有设置默认值

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

数据仍然存在,出于某种原因,我的新列在SSMS左侧数据库树上的“columns”文件夹中可见,尽管它表示“0行受影响”,并且未能更改数据库

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

UPDATE MyTable SET NewColumn = 0
轰。。桌子擦干净了。每一行都被删除

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


有人知道这里会发生什么吗。。可能是内部发生了什么事情导致我的update语句删除了表中的每一行?

除非有一个触发器在后面执行删除操作,否则update语句不能删除行,而您说该表没有触发器

因此,这必须是我在评论中为您准备的场景:行没有正确加载到新表,旧表被删除

请注意,它甚至有可能为您找到合适的位置,其中行确实在某个点加载—如果事务未提交,然后(例如)稍后当会话终止时,事务会自动回滚。该交易也可能因为其他原因被回滚


此外,我可能得到的顺序不正确:它可能会以新名称创建新表,加载行,删除旧表,并重命名新表。在这种情况下,您可能查询了错误的表,以确定数据是否已加载。我现在已经记不清表设计器是以何种方式构造脚本的了——给这只猫剥皮的方法不止一种。

updatemytable SET NewColumn=0
不会丢失行(除非您的
UPDATE
触发器编码不正确)。一定是另一个步骤丢失了它们。您有更改脚本的副本吗?更改脚本是否重命名了表,使用新列创建了一个新表,并从旧表复制了所有数据,然后最终删除了旧表?我怀疑新加载出错,然后更改被提交。。。悲哀地这是有意义的,因为当新列被设置为
notnull
且未指定默认值时,尝试将旧值插入到新表中,这正是可能发生的错误。这个故事的寓意是:在你们确信一切看起来都很好之前,不要承诺。@ErikE-听起来对我来说是正确的。SSMS生成的重建脚本很容易出现这种情况,因为它们具有
BEGIN-trans。。。提交开始传输。。。提交GO
,这样它们就不能只在SSM中运行,而不进行更改、错误处理或一次运行一个批处理。一个批处理中的错误并不意味着下一个批处理不会运行,除非
sqlcmd
模式和
:在错误退出时
@ErikE Nope我没有更改脚本,但它确实将旧表复制到临时表。它创建了Tmp_MyTable,复制了结构并添加了我的新列,插入了数据,删除了原始表,并将Tmp_MyTable重新命名为MyTable。运行脚本后,我再次检查数据是否仍然存在。。当时它还在那里。我的UPDATE语句中的某些内容导致了某些事情的发生,它删除了每一行。这个表没有触发器。是的,@ErikE完全正确。表设计器脚本具有事务控制,但缺少适当的异常处理,这是一个重大疏忽:-(完全可复制。我尝试创建表T(INT默认值1,C INT默认值2)插入T默认值,然后在设计器中的列之间插入
notnull
column
B
,并在SSMS.Empty表中运行生成的脚本。感谢Erike的解释和Martin自己的测试。我想给SSMS提供一个没有默认值的notnull列是一个不可接受的教训learned@user1003916-在这种情况下,
将XACT_ABORT设置为ON;
:在错误退出时
将停止该问题。我还没有对SSMS生成的脚本进行详尽的检查,以确定这是否总是安全的。