所以就在周末之前,我犯了一个灾难性的错误,我分心了,忘了在我为我的站点编写的代码中完成sql语句,并且完全忽略了任何 WHERE
-保存前的子句。这导致每次创建新订单时,系统中的每个订单都将其付款选项设置为新订单使用的任何选项。
这一次我很幸运,我可以用一个最近的备份来补救这种情况,并立即看到错误(但直到18万个以上的订单更改了其付款信息之后),并且我可以手动扣除创建备份后最近订单的付款。
不幸的是,我没有一个好的测试环境,我知道这是非常糟糕的奢侈。
问:为了防止类似的事情再次发生,我们是否可以设置sql server来防止这种情况 UPDATE
待审议的声明 WHERE 1
,而不是被考虑 WHERE 0
,其中 WHERE
子句完全缺失?
2条答案
按热度按时间jjjwad0x1#
您可以使用将会话变量sql\u safe\u updates设置为on
请在手册中阅读更多信息:
对于初学者来说,一个有用的启动选项是--safe updates(或者--i-am-a-dummy,具有相同的效果)。安全更新模式对于可能发出update或delete语句但忘记where子句指示要修改哪些行的情况很有帮助。通常,这样的语句会更新或删除表中的所有行。使用--safe更新,您只能通过指定标识行的键值或limit子句或两者来修改行。这有助于防止事故。安全更新模式还限制生成(或估计生成)非常大的结果集的select语句。
... (更多信息请参见提供的链接)
myss37ts2#
很少有像dbweaver这样的ide可以在update/delete语句中的where子句出现错误时向您提供警告。理想情况下,您还可以使用set sql\u safe\u mode=on;。但这只在测试环境中才合适,不确定是否可以在生产环境中启用它。sql中最正确的方法是在更新/删除之前使用触发器以自动方式进行备份