5

我有好几次意外更新生产表的所有记录。注意力不集中等等...

我听说 MySQL 是一个编译/运行时开关,以防止此类事故。就像,如果我会做一个

UPDATE Table SET Field=0

由于缺少 WHERE 子句,这不会编译/运行。如果你真的想全部更新,你可以

UPDATE Table SET Field=0 WHERE 42=42

对 MS SQL 有什么想法吗?

我在网上找到了一些关于触发器的答案。我想那会有点贵。这意味着我必须将触发器放在每个必要的表上。

4

5 回答 5

4

如果您尝试为每个人设置此设置,您可以通过打开 IMPLICIT_TRANSACTIONS 来关闭 SQL Server 的自动提交功能。见这里

如果您只关心您,则上述内容也可以在您的会话中使用SET IMPLICIT_TRANSACTIONS ON。然后,您必须实际调用 COMMIT 以使任何东西粘住。见这里

于 2013-01-21T22:07:01.457 回答
2

在这种情况下,您始终可以在发出命令之前启动事务,但不要COMMIT在末尾添加 a。这样您就可以验证查询是否具有预期的效果,如果是,请手动发出COMMIT. 如果您犯了错误,只需发出ROLLBACK.

您还可以向表中添加触发器以防止发生 INSERTS 或 UPDATES,但这会影响所有人,而不仅仅是您。

最重要的是,您永远不应该在生产系统上运行未经测试的查询;) 改用数据库的快照副本。

于 2013-01-21T12:40:41.950 回答
2

除了别人说的(MySQL安全更新模式,限制生产,先在开发服务器上测试),训练自己在SQL窗口中编写这样的更新语句并不难。

update
set
where

然后回溯到顶部,并填写详细信息。这可以防止您省略 WHERE 子句,但不会阻止您编写错误的 WHERE 子句。我现在一直这样做,即使我在本地机器上的 SQL 窗口中编写 SQL,错误更新的惩罚为零。

最好的办法可能是在您选择的文本编辑器的emacs中编写您的 SQL ,并对其进行编程以将“UPDATE”扩展为带有 WHERE 子句的部分语句。

在有人问之前,我也写了这样复杂的 WHERE 子句。

where ()

其次是

where (() or ())

然后由

where ((() and ()) or ())

然后我回去填写条件。

几年前,当我不得不用 C 编写大量代码时,我养成了这个习惯。它源于训练自己编写这样的“if”语句。省略括号和大括号导致其他人很头疼,所以我消除了这种可能性。

if () {
}
于 2013-01-21T12:46:01.510 回答
1

如何养成始终使用的习惯:

UPDATE TOP (2) dbo.table set name = etc

假设您知道您只想更新 1 行。如果您返回“受影响的 2 行”,您就知道您打错了,但至少您还没有破坏整个表格。

于 2016-02-22T03:20:26.510 回答
0

正如之前所说的其他良好做法:不允许访问 prod db,不要在没有 where 的情况下执行更新;我为他们添加了使用不同的用户和安全策略。保持良好的日志,以便您可以恢复它以防万一。整个表的更新,取决于它的大小,可能会锁定整个表!

于 2013-01-21T12:04:47.510 回答