如果缺少where子句,则阻止sql语句更新所有字段

zpjtge22  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(176)

所以就在周末之前,我犯了一个灾难性的错误,我分心了,忘了在我为我的站点编写的代码中完成sql语句,并且完全忽略了任何 WHERE -保存前的子句。这导致每次创建新订单时,系统中的每个订单都将其付款选项设置为新订单使用的任何选项。
这一次我很幸运,我可以用一个最近的备份来补救这种情况,并立即看到错误(但直到18万个以上的订单更改了其付款信息之后),并且我可以手动扣除创建备份后最近订单的付款。
不幸的是,我没有一个好的测试环境,我知道这是非常糟糕的奢侈。
问:为了防止类似的事情再次发生,我们是否可以设置sql server来防止这种情况 UPDATE 待审议的声明 WHERE 1 ,而不是被考虑 WHERE 0 ,其中 WHERE 子句完全缺失?

jjjwad0x

jjjwad0x1#

您可以使用将会话变量sql\u safe\u updates设置为on

SET sql_safe_updates=ON;

请在手册中阅读更多信息:
对于初学者来说,一个有用的启动选项是--safe updates(或者--i-am-a-dummy,具有相同的效果)。安全更新模式对于可能发出update或delete语句但忘记where子句指示要修改哪些行的情况很有帮助。通常,这样的语句会更新或删除表中的所有行。使用--safe更新,您只能通过指定标识行的键值或limit子句或两者来修改行。这有助于防止事故。安全更新模式还限制生成(或估计生成)非常大的结果集的select语句。
... (更多信息请参见提供的链接)

myss37ts

myss37ts2#

很少有像dbweaver这样的ide可以在update/delete语句中的where子句出现错误时向您提供警告。理想情况下,您还可以使用set sql\u safe\u mode=on;。但这只在测试环境中才合适,不确定是否可以在生产环境中启用它。sql中最正确的方法是在更新/删除之前使用触发器以自动方式进行备份

相关问题