我是否意外地更新了生产数据库中的所有字段?

时间:2019-12-23 21:17:51

标签: sql sql-server

我运行了以下查询。

update Finished_goods_adjustment_detail
set Actual_Price_Per_Piece = 5.90
Select * 
from 
--Finished_Goods_Adjustment F left join 
Finished_goods_adjustment_detail fd 
--on f.Company_Code=fd.Company_Code and f.Division_Code =fd.Division_Code and f.Ticket_Number = fd.Ticket_Number
Where Fd.Ticket_Number = '10063677' and fd.Company_Code ='01' and fd.Division_Code ='006'

我打算注释掉

Select * 
from 

但是我忘了。

我在注释选择*部分和更新集部分之间交替显示,以检查所做的更改。

我不小心用select *部分运行查询,但其中包含where子句。

现在看来,Finished_goods_adjustment_detail表中所有行的Actual_Price_Per_Piece字段都变成了5.90。

我不确定那是否是以前的样子,但我对此表示怀疑。使用select *不注释运行上面的查询会导致这种情况发生吗?即使在哪里说特定的票号?请帮忙。

(受影响的445217行)

在它下面说

(受影响的8行)(正确的数量)

在“消息”标签中。

2 个答案:

答案 0 :(得分:7)

不幸的是,该完整查询会导致SQL执行2条命令:

  1. 没有任何update子句的where查询
  2. 带有select子句的where查询

这就是为什么您看到2个结果集计数的原因。 445217应该是update,而8就是select

要还原数据,希望您有一个最近的备份,可以将其还原到单独的位置,以便可以仅更新此表(尤其是如果您有时间点恢复功能)。

对于将来的开发,如果要在较低的环境中进行测试,但是要测试联接,则可以重新编写注释,以防止出现PRD风险:

update Finished_goods_adjustment_detail
set Actual_Price_Per_Piece = 5.90
-- Select *  from 
--Finished_Goods_Adjustment F left join 
Finished_goods_adjustment_detail fd 
--on f.Company_Code=fd.Company_Code and f.Division_Code =fd.Division_Code and f.Ticket_Number = fd.Ticket_Number
Where Fd.Ticket_Number = '10063677' and fd.Company_Code ='01' and fd.Division_Code ='006'

现在,您只需突出显示SELECT *中的所有内容即可仅使用SELECT获得结果,或者运行整个查询以获取UPDATE。无论哪种方式,都可以防止在没有正确的联接或SELECT子句的情况下意外运行UPDATEWHERE

答案 1 :(得分:1)

Jason W提供的答案几乎可以解决这个问题。但是,我想对以后如何避免这种情况提供一些建议(您知道,我们所有人中都有这些时刻,包括我自己)。

具体来说,通过稍微调整编码样式,可以引入可靠的故障保护功能,这样更新将无法进行。您需要做的只是通过别名而不是名称来引用更新的表:

update fd
set Actual_Price_Per_Piece = 5.90
Select * 
from 
Finished_goods_adjustment_detail fd 
Where Fd.Ticket_Number = '10063677' and fd.Company_Code ='01' and fd.Division_Code ='006'

fd子句中定义了FROM别名,并且(希望)数据库中不存在具有该名称的对象。这样,update将因“找不到对象”错误而中断,并且select将照常运行(或根本不运行,这取决于XACT_ABORT连接选项和{ {1}},仅举几例。

很简单,真的。

P.S。顺便说一句,同样的方法也适用于Try/Catch语句。只是说'...