5

質問:
通常、ロールバックを使用して SQL コマンドを元に戻すことができます。

BEGIN TRY
  BEGIN TRANSACTION
  /* run all your SQL statements */
  COMMIT TRANSACTION
END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION
END CATCH

私の質問:
「1人」がこれをした場合

UPDATE TABLE_X SET FIELD_X = 'bla'
GO

SSMSで(最後に go があることに注意してください) 、WHERE 句を指定するのを忘れていました。SSMS がこのコマンドを実行した暗黙的なトランザクションをロールバックすることは可能ですか (およびその方法) (最後に go を含むステートメントは、トランザクションで暗黙的に実行されます)。 ?

注:
私はそれをしませんでしたが、私の同僚が数日前に (行かずに) しました。
私は彼が受けた被害を元に戻しました (幸いなことに、彼がそうする 0.5 時間前にバックアップを作成しました)。

4

3 に答える 3

4

いいえ、できません。簡単ではありません。バックアップからの復元が最適なオプションです。

于 2012-08-24T08:34:47.220 に答える
2

以下のリンクを参照してください。役立つと思います

テーブルから古いデータを復元する方法

ありがとうアルン

于 2012-08-24T08:39:23.997 に答える
1

GO暗黙的なトランザクションの終了を指定するのではなく、バッチの終了を指定します。そのため、(残念ROLLBACKながらUPDATE) GO.

MSDNページからGO

GO は Transact-SQL ステートメントではありません。これは、sqlcmd ユーティリティと osql ユーティリティ、および SQL Server Management Studio コード エディターによって認識されるコマンドです。

SQL Server ユーティリティは、GO を、Transact-SQL ステートメントの現在のバッチを SQL Server のインスタンスに送信する必要があるというシグナルとして解釈します。ステートメントの現在のバッチは、最後の GO 以降、またはこれが最初の GO である場合はアドホック セッションまたはスクリプトの開始以降に入力されたすべてのステートメントで構成されます。

指定した場合、UPDATEコマンドは暗黙的なトランザクションの開始としてのみ表示されますSET IMPLICIT_TRANSACTIONS ON;(こちらを参照)。その場合、いくつかのコマンド ( CREATEDELETEUPDATEなど) によって新しい暗黙的なトランザクションが自動的に開始され、そのトランザクションはROLLBACKまたはを発行するまで終了しませんCOMMIT

(たとえば、SQL Server でのトランザクションとバッチの違いの詳細については、ServerFault に関するこの質問: SQL Server: Statements vs. Batches vs. Transactions vs. Connectionsを参照してください。)

于 2012-08-24T09:43:53.183 に答える