web-dev-qa-db-ja.com

SQL Server 2008R2で間違った更新ステートメントの後にロールバックする方法は?

select * from aa

update aa set City='chennai',LastName='vinoth';

ID  FirstName  LastName  City
29  Abcrdrr    vinoth    chennai
1   John       vinoth    chennai
2   Joe        vinoth    chennai
35  raja       vinoth    chennai
38  Johsdfgn   vinoth    chennai

誤って更新しましたLastname, Cityすべての行の列。次に、古いテーブル行にロールバックします。

SQL-Server 2008R2を使用します。

5
Vinoth _S

何らかの履歴テーブルとトリガーを配置していない限り、すべての変更で古い値を保持するため、または更新を実行する前にテーブルのコピーを作成した場合を除き、最後のbackupを使用する必要があります。それはその更新の前に取られました。それを(一時データベースとして)復元し、データを抽出します。
バックアップはありますか?

ところで、次回更新するときは、次のように設定することをお勧めします。

SELECT *
-- UPDATE t SET Column1 = x, Column2 = y
FROM MyTable AS t
WHERE ...

最初にSELECTを実行して、更新される行を正確に確認します。必要に応じて、WHERE句を調整して、ターゲットにする行を取得します。次に、文をUPDATEから最後までマークして実行します。 WHERE句を忘れて、 "ブラインド"更新を実行する方がはるかに安全です(これが問題だったと思います)。
より安全です-最初にいくつかのテストデータベースで実行してください。

16

別のアプローチはfn_dblogはトランザクションログ内を確認します。それは静かな事前のトピックなので、優れた記事を参照してください SQL Serverログの読み取りと解釈の方法 - Remus Rusan による

今後回避するために、いつでもトランザクションを使用できます

BEGIN TRAN
BEGIN TRY
  update tbl set City='chennai',LastName='vinoth' from aa AS tbl;

  -- if update is what you want then
  COMMIT TRAN
END TRY
BEGIN CATCH
  -- if NOT then
  IF @@TRANCOUNT > 0
      ROLLBACK
  THROW
END CATCH

編集:複雑なT-SQLを作成するときは、TRY-CATCHブロックしてTRANSACTIONを使用すると、例外が発生した場合やクエリがキャンセルされた場合にリソースをロックしません。それ以外の場合、クエリが複雑でない場合は、トランザクションを使用しないことをお勧めします。

また、Blazが述べたように、データベースに変更を加える前に、データベースまたはテーブルのみのバックアップを取ることは常に良いことです。

13
Kin Shah