BEGIN TRAN;Truncate Table ~;ROLLBACK TRAN を実行する暇を持て余した神々の遊びをするとどうなるかという軽いネタです。
実行するときは自己責任でお願いいたします。
■Truncate Table はロールバックできるか
結論を先に書いてしまうと Truncate Table はロールバックできます。
Truncate Table の説明には以下のように記載されています。
各行の削除内容を記録せずにテーブル内のすべての行を削除します。TRUNCATE TABLE は、WHERE 句を伴わない DELETE ステートメントに似ています。ただし、TRUNCATE TABLE の方が高速で、使用するシステム リソースとトランザクション ログ リソースも少なくなります。
DELETE ステートメントは、一度に 1 行ずつ削除し、削除した各行のエントリをトランザクション ログに記録します。TRUNCATE TABLE は、テーブル データを格納するのに使用するデータ ページの割り当てを解除することによってデータを削除し、ページの割り当ての解除だけをトランザクション ログに記録します。
Truncate Table によるデータの削除ですが、各行を削除したという記録はされません。
DELETE を実行した場合、削除した行毎に削除のログ (LOP_DELETE_ROWS) が記録されます。
それでは、Truncate Table は実行した場合、どのようなログが記録されるでしょう。
Truncate Table を実行した場合もログは記録されますが、データの各行に対して記録はされません。
PFS / GAM / IAM というような管理領域の変更のみを実行します。
Truncate Table は対象のテーブルで使用していたデータページを未割り当てとしてビットを立てることでデータの削除を行います。割り当てている領域を解放するという処理になりますので DELETE と比較して高速に削除を行うことができます。
この際、どの領域を解放したかはログに記録していますので、トランザクションの中でロールバックをすることが可能です。
データ削除時のリカバリ案としてトランザクションの中で Truncate Table を実行するのは考えとしてありかもしれないですね。