2008-12-11 72 views
2

我是一名兼职开发人员(全职学生)和我工作的公司使用SQL Server 2005中,我觉得奇怪有关SQL Server的事情,如果你这样做,包括插入,更新等有一个脚本除了回滚或使用事务之外,没有任何真正的方法可以撤消它。SQL服务器undo

你可能会说这两个选项有什么问题?那么如果有人做了更新声明并忘记放入WHERE条款,您突然发现自己有13k行更新,并且该表中的所有客户端突然被命名为'bob'。现在你有13k bobs的愤怒,因为“某人”忘记了使用一个事务,并且如果你做了回滚,你将会取消其他领域需要的关键变化。

在我的学习中,我有Oracle。在Oracle中,您可以先运行该脚本,然后在发现没有任何错误时提交该脚本。我想知道是否有什么我在SQL Server中错过了,因为我在开发人员世界中还是比较新的。

回答

5

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

+0

那么,如果一个人做了一个简单的查询,它会变成永久性的?不包括必须使用回滚 – Drahcir 2008-12-11 19:33:19

+0

是的,它基本上是在执行时提交的。 – 2008-12-11 19:36:37

0

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

0

据我所知,SQL Server 2008中添加了审计功能,记录用户做出的各种数据库的所有变化,也有回滚他们事后的选项。

再一次,这是从我读过的或听到我们的DBA,但可能值得研究。

编辑:寻找到它之后,它似乎只给回滚的架构更改,而不是数据修改(DDL触发器)的能力。

0

如何:从不更改还没有被一号您的开发服务器上测试生产数据库,并试图什么是未探明之前,一定要备份。

+0

Ofcourse,我使用一个测试数据库之前,对活的一个进行任何更改。但是每个人都容易出错。 – Drahcir 2008-12-11 19:41:49

5

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

0

如果我做的事情,在SQL Server中的任何风险,我写这样的剧本:

BEGIN TRAN

插入....无论

更新....无论

- 凯明

最后一行是有意的评论:我第一次运行前行,然后确保没有错误,然后突出显示算了笔他说,提交并执行。这是可行的,因为在Management Studio中,您可以选择T-SQL的一部分并执行选定的部分。

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