安全地删除sqlserver中的行,以便您可以回滚提交

Too*_*arn 3 t-sql transactions sql-server-2008

昨天我问这个问题Funky删除问题

现在我想现在如何安全删除.

那么我如何使用提交和事务以及语法糖来覆盖我的@ $$,因为昨天我笨拙地删除了51,000行.我有一个备份,但我仍然认为HOLY ^%$#太容易了.

那我该怎么做呢?

    DELETE FROM bBoxHeader
    WHERE bBoxHeader.bHeaderId <> '1099' 
    -- Ooops meant that to be equal. How do I roll back?
Run Code Online (Sandbox Code Playgroud)

我如何包装它,所以我不会吹掉51000行

Aar*_*and 14

每当您针对生产数据进行未经验证的临时DML时,您应始终将其包含在BEGIN TRANSACTION中,并使用后续的COMMIT和ROLLBACK.如果你在没有检查的情况下运行它然后意识到你搞砸了,你可以回滚它.否则你可以提交它.

BEGIN TRANSACTION;

DELETE ... WHERE ...

-- COMMIT TRANSACTION;
---^^^^^^ if the number of rows affected is correct, highlight this & execute

-- ROLLBACK TRANSACTION;
---^^^^^^^^ otherwise highlight this and execute
Run Code Online (Sandbox Code Playgroud)

请注意,这也可能导致你说什么,因为如果你忘记运行回滚或提交,然后去吃午餐或回家周末,你可能会回来看看你的粉红色单.

  • @TooMuchToLearn没有人说这会让你成为一个讨厌的人.我认为这个建议是基于这样一个事实,即如果你对生产数据负责,并且意外删除可能会使你失去工作,那么你的雇主可能会让你对你不理解的事情负责,对你不公平.这绝对是一个你可以获得理解的地方,但评论是根据你的情况而不是你目前的知识来解决的. (4认同)
  • +1,那里有好的警告.(并且,为了记录,我这次与你在这里回答无关) (2认同)
  • 您突出显示BEGIN TRANSACTION和DELETE并点击F5.如果你意识到"哦,废话!" 你突出显示ROLLBACK TRANSACTION(没有主要评论)并点击F5.如果DELETE是正确的,则突出显示COMMIT TRANSACTION(再次,没有前导注释字符)并按F5键. (2认同)