我偶然发现了几次意外更新生产表的所有记录。 缺乏关注和诸如此类的......
我在MySQL中听说过编译/运行时开关可以防止此类事故发生。 就像,如果我愿意的话
UPDATE Table SET Field=0
由于缺少WHERE子句,因此无法编译/运行。 如果你真的想要全部更新,你可以
UPDATE Table SET Field=0 WHERE 42=42
MS SQL的任何想法?
我在网上找到了一些关于触发器的答案。我想这会有点贵。 这意味着我必须将触发器放在每个必要的桌子上。
答案 0 :(得分:2)
在这种情况下,您始终可以在发出命令之前启动事务,但最后不添加COMMIT
。这样您就可以验证查询是否具有所需效果,如果是,则手动发出COMMIT
。如果您犯了错误,只需发出ROLLBACK
。
您还可以向表中添加触发器以防止发生INSERTS或UPDATES,但这会影响所有人,而不仅仅是您。
最重要的是,您应该永远不要在生产系统上运行未经测试的查询;)请改用数据库的快照副本。
答案 1 :(得分:1)
除了其他人所说的(MySQL安全更新模式,限制访问生产,首先在开发服务器上进行测试)之外,在SQL窗口中编写这样的更新语句并不困难。
update
set
where
然后回溯到顶部,并填写详细信息。这可以防止您省略WHERE子句,但它不会阻止您编写错误的WHERE子句。我现在一直这样做,即使我在本地机器上的SQL窗口中编写SQL,其中更新错误的罚款为零。
最好的办法是将您的SQL写入 emacs 您选择的文本编辑器,并对其进行编程以将“UPDATE”扩展为带有WHERE子句的部分语句。
在有人要求之前,我还会编写像这样的复杂WHERE子句。
where ()
接着是
where (() or ())
然后
where ((() and ()) or ())
然后我回去填写条件。
几年前,当我不得不在C中编写大量代码时,我养成了这个习惯。这源于训练自己编写像这样的“if”语句。省略的parens和braces使其他人头疼,所以我消除了这种可能性。
if () {
}
答案 2 :(得分:0)
正如之前所说的其他良好做法:不允许访问prod db,不执行更新而不在哪里;我为它们添加了不同的用户和安全策略。保持良好的日志,以便您以其他方式还原它。整个表的更新,取决于它的大小,可能会锁定整个表!
答案 3 :(得分:0)
如何养成一直使用的习惯:
UPDATE TOP (2) dbo.table set name = etc
让我们说你知道你只想更新1行。如果你回来了#2; 2行受影响",你知道你弄错了,但至少你没有破坏enire表。