紧张的运行查询(SQL Server):您怎么看待这个?

时间:2009-11-04 20:36:19

标签: sql sql-server transactions

我是SQL Server Management Studio的常用用户。有时我会遇到更新或删除查询要运行的情况,但我担心我的一些拼写错误或逻辑错误会导致我对表进行不必要的大规模更改(比如更改1000行时)我打算改变2)。

在过去,我只是紧握拳头并屏住呼吸,但后来我想知道在遇到可能发生灾难性的查询之前我是否可以做这样的事情:

1)在

下面运行
begin transaction
(my update/insert/delete statement I want to run)

2)如果我满意,请致电:

commit transaction

3)或者,如果我犯了什么罪,请致电:

rollback transaction

我的想法是否合理,还是我错过了一些基本的东西?我知道我可以随时恢复我的数据库,但与上面相比,这似乎有些过分。

编辑:

1)我同意在做任何事情之前在测试网站上进行测试,但是仍然有可能在生产服务器上发生问题。也许某些条件在测试服务器上是正确的,但在生产时并非如此。

2)我也习惯先写我的地方,或者先用我的地方做一个选择,以确保我隔离正确的行,但同样,总会出现问题。

8 个答案:

答案 0 :(得分:11)

将WHERE语句作为SELECT运行,然后再将其作为UPDATE或DELETE

运行

答案 1 :(得分:4)

是的,你绝对可以做到这一点。请注意,您正在锁定相关的表,这可能会干扰其他数据库活动。

答案 2 :(得分:3)

这个特别声明至少两次拯救了我的屁股。

SELECT * INTO Table2_Backup FROM Table1

我也完全同意马努的意见。在UPDATE或DELETE之前选择

答案 3 :(得分:2)

这种担心的最常见原因是被迫手工处理生产数据库。如果是这样的话......可能会更好地获得一些开发盒。如果没有,我认为你很好......

答案 4 :(得分:2)

对我来说听起来不错 - 我基本上使用这个默认的try / catch查询来解决我的大部分问题。就像你勾勒出的那样工作,如果出现问题,它会给你错误信息:

BEGIN TRANSACTION
BEGIN TRY

    -- do your work here

    COMMIT TRANSACTION

END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage

    ROLLBACK TRANSACTION
END CATCH

马克

答案 5 :(得分:1)

你可以做的另一件事,虽然它需要练习:总是首先写你的WHERE子句,所以你永远不必担心在所有行上运行UPDATE或DELETE。

答案 6 :(得分:0)

这是我在编写要从查询窗口运行的文本时所做的工作,我已经完成了修复从导入中的客户端发送给我们的错误数据(我总是先在dev上执行此操作)

begin tran

delete mt
--select * 
from mytable mt where <some condition>

--commit tran
--rollback tran

begin tran

update mt
set myfield = replace(myfield, 'some random text', 'some other random text'
--select myid, myfield, replace(myfield, 'some random text', 'some other random text'
from mytable mt where <some condition>

--commit tran
--rollback tran

注意这样,我可以运行查询的select部分,首先查看将受影响的记录以及如何。注意where子句与表格在同一行(如果我有多个连接,则为最后一个连接)这可以防止oops我忘记突出显示整个问题。请注意,删除使用别名,因此如果您偶然运行第一行,则不会删除整个表。

我发现最好编写脚本以便它们可以在不突出显示的情况下运行(除非我只突出显示选择部分以查看我正在影响的记录)。将脚本保存在源代码管理中。如果你通过在dev和QA上运行来测试tscript,你可以在没有选择的情况下在prod上运行它。如果您正在影响表上的大型更新或删除,我几乎总是首先将这些记录复制到工作表中,以便在出现问题时立即返回。

答案 7 :(得分:0)

如果你想成为(或必须)对此非常偏执,你应该有一些旧/新val的日志表(table / column / old val / new val;也许是用户和时间戳)和在插入/更新/删除时用触发器填充它。从这里恢复一些旧的价值真是一件麻烦事,但如果其他一切都发生了可怕的错误,这可能会有所帮助。但是,性能影响非常大。

SAP正在使用这种方法(在SAP的说法中称为更改文档)通过其GUI进行更改,并为程序员提供了一种方法,可以通过“程序”进行更改(尽管您必须明确地调用它)。