PostgreSQL でのトランザクションの動作 [DDL (データ定義言語) もロールバック可能]

PostgreSQL でのトランザクションの動作

PostgreSQL データベースでは、トランザクション内でデータ変更のロールバックだけでなく、DDL 文 (データ定義言語) もロールバックすることが出来ます。Oracle 等のデータベースでは、ロールバックによって DDL 文 (データ定義言語) を取り消すことは出来ません。

つまり CREATE TABLE や DROP TABLE、ALTER TABLE 等でテーブルの作成・削除・変更を行ったものもロールバックすることが出来るのです。

以下に、実際にトランザクション内でテーブルを削除した場合の動作を記載しています。テーブルを削除しても、ロールバックすることでテーブル削除が取り消されています。

=> SELECT * FROM hoge;
+----+------+
| id | name |
+----+------+
|  1 | foo  |
|  2 | bar  |
|  3 | taro |
+----+------+
(3 rows)


トランザクション開始
=> BEGIN;
BEGIN

テーブル削除
=> DROP TABLE hoge;
DROP TABLE

ロールバック
=> ROLLBACK;
ROLLBACK


=> SELECT * FROM hoge;
+----+------+
| id | name |
+----+------+
|  1 | foo  |
|  2 | bar  |
|  3 | taro |
+----+------+
(3 rows)

この動作は、テストプログラムを作成する場合に、非常に有用です。データベーステストを実施する前にトランザクションを開始し、テスト用のテーブルを作成したりテスト用の PL/PgSQL 関数を作成し、テストが終わったらロールバックして全ての変更を取り消します。それによって何度でも同じテストプログラムを実行できるようになるわけです。