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 |
サンプルファイル (LZH形式 815 KB)
|
|
|