防止任何表上的意外更新/删除

时间:2013-01-21 11:54:08

标签: sql sql-server triggers

我偶然发现了几次意外更新生产表的所有记录。 缺乏关注和诸如此类的......

我在MySQL中听说过编译/运行时开关可以防止此类事故发生。 就像,如果我愿意的话

UPDATE Table SET Field=0

由于缺少WHERE子句,因此无法编译/运行。 如果你真的想要全部更新,你可以

UPDATE Table SET Field=0 WHERE 42=42

MS SQL的任何想法?

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

4 个答案:

答案 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表。