• ベストアンサー

ロールバック

早速ご教示ください。 DELETE FROM テーブル名 この構文を用いて、テーブルを削除したいと考えております。 参考書で調べたところ、TURNCATE TABLE文だとロールバックできないが、処理が高速と記述してあります。 DELETE FROM TABLE文だとロールバックできない状態での削除は注意してくださいとあります。 つまりは、DELETE FROM TABLE文だとロールバックできる状態での削除なら削除前に戻せると言うことなのでしょうか? (1)ロールバックってなんですか? (2)ロールバックできる状態、できない状態。その両方の状態をご教示く ださい。  またロールバックはどのように行うのでしょうか? 以上、ご教示の程宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

(1)ロールバックとは、文字通り「元に戻す」ことです。 削除なら削除前の状態に戻すことをいいます。 つまり、ある特定の条件下では、削除しても元に戻せるということです。 参考書はOracleに代表される一般的なデータベースの参考書であると思われますが、SQL Serverは少しそれには当てはまらない動きをします。 通常のデータベースとは違うのは、TRUNCATEしてもロールバックできるという点です。 (2)ロールバックできる状態にするには、SQL Serverの場合はトランザクションモードにする必要があります。 細かい説明まではまだ必要ないでしょうから、ざっくり説明しますと、 トランザクションモードとは、「一連の処理をワンセットとして取り扱うモード」というようなイメージです。 トランザクションモードに入ってから、モードを終わらせるまでの間に実行した処理はまとめて確定(COMMIT)するか、まとめて取消(ROLLBACK)するかのどちらかとなります。 方法は「BEGIN TRANSACTION(またはBEGIN TRAN)」を実行するだけです。それでそのセッションはトランザクションモードになります。 終わらせるには「COMMIT TRAN(確定)」または「ROLLBACK TRAN(取消)」のいずれかを実行します。 (SQL Server Management Studioでクエリを打ち込む画面を開きますよね?SSMSでは、その1画面単位で1セッションとなります) 便利なようにみえますが、トランザクションモードの間はいわば処理は保留状態ということになりますので、更新などを掛けるとそのレコードには他のユーザは(トランザクションモードが終わるまでは)アクセスできなくなります。使う場合は、そういうモードだと思って使ってください。 ロールバックの例 BEGIN TRAN GO DELETE FROM TABLEX <=まちがえて全件削除 GO ROLLBACK TRAN GO

runathicku
質問者

お礼

ありがとうございます! ものすごく解りやすい説明です。 早速実行してみます!

その他の回答 (1)

  • wolf03
  • ベストアンサー率22% (241/1086)
回答No.1

ロールバックとは前回確定してからの変更を前回確定時まで戻すことです。 ロールバックできない状態はロールバック領域が足りないなどロールバック用の情報が欠けてしまっている状態です。 もしくは、頻繁に更新がされていて他の処理に影響を与えるような場合です。 まず用語を勉強する方がよいかと思いますが。

関連するQ&A

  • ロールバックできないステートメントについて

    こんばんは。 既存のテーブルのカラムを削除することになりまして、 以下の手順で変更をかけました。 環境:mysql_5.5 mysql>begin; mysql>alter table test_table drop column test_column; mysql>desc test_table; mysql>rollback; mysql>desc test_table; しかし、ロールバックをかけても元に戻らなかったのですが、 http://dev.mysql.com/doc/refman/5.1/ja/cannot-roll-back.htmlhttp://dev.mysql.com/doc/refman/5.1/ja/cannot-roll-back.html の記述にあるようにバージョン5.5でもalterでのロールバックは出来ないのでしょうか。 英語のサイトを見たのですが、ただしく訳せませんでした。 http://dev.mysql.com/doc/refman/5.5/en/implicit-commit.htmlhttp://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html 回避方法があったら、教えてください。

  • ロールバックできず困っています。

    1.テーブルAに、新たに列を追加したテーブルBを作成。 ↓ 2.テーブルAのデータをテーブルBにコピー。 ↓ 3.テーブルAを削除。 ↓ 4.テーブルBの名前をテーブルAに変更。 という一連の処理があります。 これらの処理でエラーが発生した場合、処理実行前の状態に戻したいのですが、ロールバックできずに消されるはずだった不要なテーブルが残ってしまいます。 何か方法はありますか?よろしくお願いします。

  • WMP10のロールバックが出来ない

    WMP10を9に戻したいのですが、コントロールパネルのプログラムの追加と削除でWindows XP-ソフトウェアの更新の中のWindowsMediaPlayer10の変更と削除のボタンをクリックしロールバックしますかのメッセージが出て、クリックすると直ぐ終了し「ロールバック完了しました」と出ますが、10のままです。 どうしたら出来るのでしょうか? 宜しくご教示下さい。

  • すべてのテーブルのすべてのレコードを削除する方法

    データベースを扱うプログラムに対してユニットテストを行いたいと思っています。 それぞれのテストが終了するごとにすべてのテーブル内のすべてのレコードを削除したいのですが、 delete from table_a; delete from table_b; delete from table_c; ... のように書くと、外部キー制約に引っかかってしまい削除できないことがあります。 短いSQL文で複数のテーブル内のレコードをすべて削除する方法はないのでしょうか? よろしくお願いします。 ちなみに、私が現在使っているDBMSはPostgreSQL 8.1です。

  • 一括更新の際のロールバックセグメント

     ただいまOracleの勉強中でふと気になったので、暇なときにでもお答えくださいませんか。  A と B と二つのテーブルがあって、一方の値で他方を一括更新かけるのに、以下のような SQL を発行したとします。 UPDATE TABLE_A A SET ( A.COL_1 ) = (SELECT B.COL_2 FROM TABLE_B B, A WHERE B.COL_KEY = A.COL_KEY)  この場合、A のデータがもし100万件あれば100万回、サブクエリーを実行して UPDATEをかけるといった処理が走ると思いますが、このとき、ロールバックセグメントも100万件分の大きさが必要になるのでしょうか?  そして、もしロールバックセグメントが不足した場合は、全体がロールバックされて何もなかったことになるのでしょうか?

  • PL/SQLのDELETE文について

    PL/SQLでDELETE文を書こうとしているのですが、 文法がわかりません。。。 分かる方がおられましたら、教えてくださいm(_ _)m 今、TABLE1を削除したいのですが、条件がいろいろあって、 以下のように書いてみたのですがダメでした。 こういう書き方は、できないんでしょうか・・・。 削除条件は、TABLE2に存在し、かつ、TABLE2のTENSUが0のもので、 TABLE3が存在しないものです。 DELETE TABLE1 FROM TABLE1 ,TABLE2 ,TABLE3 WHERE TABLE1.ID = TABLE2.ID AND TABLE2.TENSU = 0 AND Not Exists (SELECT TABLE3.ID FROM TABLE3 WHERE TABLE3.ID = TABLE2.ID) 説明が下手なので、うまく、伝わっているか、心配なのですが・・・、 よろしくお願いします。

  • ロールバックが動作しない。

    ロールバックが動作しない。 以下の文をSQLクライアントで実行するとテーブルに登録されてないはずなのですが、 なぜか登録されています。解決方法を教えてください。 ---------------------------------------------- SET AUTOCOMMIT=0; begin; INSERT INTO テーブル (カラム)VALUES ('AAA'); rollback; -----------------------------------------------

    • ベストアンサー
    • MySQL
  • DELETE文でFROM句を省略した場合

    ちょっと疑問に思った程度の事なのですが DELETE文でFROM句を省略した場合の処理について質問です。 DELETE文の構文で DELETE FROM table_nam; と DELETE table_name; で、処理結果は同じだと思うのですが、 FROM句と付けた時と付けていない時とでは、内部的な処理に何か違いがあるのでしょうか?

  • 仕事のミス:本番データの削除→ロールバック

    こ、こんばんわ 私は客先でオブジェクトブラウザ(OB)を使って仕事している 新米SEです。 今日OBを使って本番データを操作していたところ、 あやまって一テーブルのデータを全件削除してしまいました。 すぐに気づいて青くなり、気を落ち着けて慎重にロールバックボタンを押したところ、 全データ復活しました。 消えている間そのテーブルに関するバッチプログラムも動いていません。 なので、特に報告もしなかったのですが、 今日のこのミスは報告しなくてもよかったんだろうか といまさら悩んでいます、、。 いったんデリートしたという事実はアーカイブログかなんかで わかるんですよね? ウツです。。

  • 複数テーブルの一括削除

    複数のテーブルを一括して削除(DROP TABLE)したいのですが、 テーブル名を一つ一つ記述しないといけないのでしょうか? テーブル名の頭文字は全てTから始まります。 ご教示の程宜しくお願い致します。