SQL Server UNDO

时间:2008-12-11 19:19:49

标签: sql-server transactions

我是兼职开发人员(全职学生)和我正在工作的公司使用SQL Server 2005.我发现SQL Server有些奇怪,如果你做一个涉及插入,更新等的脚本,那么就没有除了回滚或使用事务之外,任何实际的撤消方法。

您可能会说这两个选项出了什么问题?好吧,例如,如果某人做了更新语句并忘记放入WHERE子句,您突然发现自己更新了13k行,并且该表中的所有客户端突然被命名为“bob”。现在你有13k bobs的愤怒,因为“某人”忘记使用交易,如果你做回滚,你将撤消其他领域所需的关键变化。

在我的学习中,我有甲骨文。在Oracle中,您可以先运行脚本,然后在发现没有任何错误时提交它。我想知道在SQL Server中是否存在我遗漏的东西,因为我在开发人员世界中仍然相对较新。

7 个答案:

答案 0 :(得分:5)

我不相信你错过了什么。使用事务来防止这些错误是最好的机制,它与Oracle用于保护最终用户的机制相同。不同之处在于Oracle隐式地为您开始了一个事务,而在SQL Server中您必须明确地开始它。

答案 1 :(得分:5)

SET IMPLICIT_TRANSACTIONS是您可能正在寻找的。

答案 2 :(得分:3)

我不是数据库/ SQL服务器专家,我不确定这是否是您正在寻找的,但有可能创建数据库的快照。快照允许您随时将数据库恢复到该状态。

检查此链接以获取更多信息: http://msdn.microsoft.com/en-us/library/ms175158.aspx

答案 3 :(得分:0)

我认为交易运作良好。您可以回滚数据库(到以前的备份或日志中的点),但我认为事务更简单。

答案 4 :(得分:0)

据我了解,SQL Server 2008添加了一项审核功能,可记录用户对各种数据库所做的所有更改,并且还可以选择在事后将其回滚。

同样,这是我从DBA那里读到或听到过的,但可能值得研究。

编辑:在查看之后,它似乎只能回滚模式更改,而不是数据修改(DDL触发器)。

答案 5 :(得分:0)

如何:永远不要对尚未在开发服务器上测试过的生产数据库进行更改,并且在尝试未经证实的任何事情之前始终进行备份。

答案 6 :(得分:0)

如果我在SQL Server中冒任何风险,我会编写如下脚本:

BEGIN TRAN

插入....无论

更新....无论

- COMMIT

最后一行是关于目的的注释:我首先运行之前的行,然后确保没有错误,然后突出显示单词Commit并执行它。这是有效的,因为在Management Studio中,您可以选择T-SQL的一部分,然后只执行选定的部分。

有一些优点:隐式事务也可以工作,但它不是SQL Server的默认值,因此您必须记住打开它或设置选项来执行此操作。此外,如果它一直处于开启状态,我发现人们很容易“忘记”并让未提交的事务处于打开状态,从而阻止其他事务。这主要是因为它不是默认行为,并且SQL Server人员不习惯它。