データベース千夜一夜第8回

データの加工命令(2)~レコードの削除と削除処理の注意点 長谷川裕行
有限会社 手國堂

トランザクションの制御について

DELETE命令を取り消すために“BEGIN TRANSACTION”と““ROLLBACK TRANSACTION”という命令を記述しました。これらについて簡単に補足しておきます。


- トランザクションログ -

先のDELETE命令のところで、DELETE文の前に

  BEGIN TRANSACTION

という命令を実行しました。

データベース・エンジンは、万一の場合に処理を取り消せるよう、実行したデータの変更処理をトランザクションログに記録できます。これを「トランザクション制御の開始」と呼びます※4

データベースに対する変更をトランザクションログに記録するための命令が“BEGIN TRANSACTION”(“BEGIN TRAN”と略せます)で、これ以降に施した変更はすべて記録されます。

※4 SQL ServerのBooks Onlineでは「トランザクションの開始」と表現されています


- ロールバック -

ログに記録された内容に基づいてデータベースへの変更を取り消すには“ROLLBACK TRANSACTION”(“ROLLBACK”と略せます)命令を発行します。これによって、“BEGIN TRANSACTION”でトランザクション制御を開始した時点まで、その間の処理を取り消して元の状態に戻すことができます。

先にDELETE文によって削除されたテーブルのレコードを元に戻せたのは、DELETE文の前に“BEGIN TRANSACTION”でトランザクションの記録を開始し、削除後に“ROLLBACK TRANSACTION”を発行したからです。変更を取り消して元の状態に戻すことを、ロールバックと呼びます。


- 様々な変更を取り消せる -

“BEGIN TRANSACTION”でトランザクションログを記録すれば、それ以降の様々な処理――全件削除処理だけではなく、WHERE句を使った特定レコードの削除や、INSERT命令によるレコードの追加などデータベースに対する様々な変更――を、“ROLLBACK TRANSACTION”によって取り消せます。

“BEGIN TRANSACTION”で開始したトランザクションログの記録は、“COMMIT TRANSACTION”(“COMMIT”と略せます)命令によって終了します。これを「コミット」と言います。ROLLBACKによって変更を取り消さない場合はCOMMITで変更を確定し、ログの記録を終了させます。

取り消し操作が必要なときにだけ記録を開始し、その間の一定の処理を終えたらロールバックまたはコミットによって記録を終了させる――ということです。こういった、変更の記録や取り消しなどの処理を「トランザクションの制御」と呼びます。

トランザクションの制御については、回を改めて詳しく説明します。今の段階では、一度実行した操作を記録しておき、後から取り消すことができる――ということだけを覚えておいてください。


あとがき

冒頭にも書いたように、レコードの削除処理自体は非常に簡単に記述できます。ただ、削除は追加と違って「情報を消してしまう」処理なので、気軽に実行してはいけません。実際のアプリケーションでは、次の2点に注意を払いましょう。

1.実際に削除する前にユーザーに確認を求める
2.間違えて削除した場合に備えて元に戻せるようにする


- サンプルデータベースの扱いについて -

今回紹介したレコード削除のSQL文を実行すると、サンプル・データベース“db1001ya”の内容を書き換えることになります。

書き換えた内容のまま使い続けても問題はありませんが、気になる方はサンプルを実行する前に“db1001ya”のバックアップを取っておいてください。手順は以下の通りです。

(1) SQL Serverのサービスマネージャを開く
(2) ボタンをクリックしてSQL Serverサービスを停止する
(3) データフォルダ(標準では“C:\MSSQL\Data”)内にある“db1001ya.mdf”を他のフォルダにコピー
(4) SQL ServerのサービスマネージャでをクリックしてSQL Serverサービスを開始する

元(書き換える前の内容)に戻すには、上記の(1)~(2)でSQL Serverを停止させ、SQL Serverのデータフォルダにある(書き換えられた)“db1001ya.mdf”を削除して、上記(3)で別フォルダに保存した“db1001ya.mdf”を元の場所にコピーします。

データベースごと削除して新たにダウンロードしたサンプル・データベースをインストールし直しても構いません。

本コラムの第3回で紹介しているダウンロード手順でサンプル・データベースをダウンロードし、先にスクリプト“DelExampleDb.sql”をクエリアナライザで実行して“db1001ya.mdf”を削除します。その上でダウンロードした“db1001ya-1.mdf”をSQL Serverのデータフォルダにコピーし、クエリアナライザで“AddExampleDb.sql”を実行します。

2つのスクリプトの内容は以下の通りです。詳しくは第3回のコラム末尾をお読みください。

DelExampleDb.sql
データベース“db1001ya”をSQL Serverから削除します。スクリプトは以下の1行です。

sp_detach_db db1001ya

AddExampleDb.sql
サンプルデータベースをSQL Serverに登録します。“db1001ya-1.mdf”をデータフォルダに保存してから実行してください。
スクリプトは以下のようになっているので、mdfファイルを異なる場所に保存したときは、アンダーラインの箇所を適切なパスに書き換えてください。

CREATE DATABASE db1001ya
ON PRIMARY (FILENAME = 'C:\MSSQL\Data\db1001ya-1.mdf')

FOR ATTACH
GO



Downloadサンプルファイル (LZH形式 815 KB)


トップページ
レコードの削除~DELETE命令
特定のレコードを削除する
全行削除の2つの命令
DELETEとTRUNCATE TABLEの違いを試す
トランザクションの制御について
トランザクションログ
ロールバック
様々な変更を取り消せる
あとがき
Copyright © MESCIUS inc. All rights reserved.