DB

【MS Access】DDL(テーブル定義の変更)をロールバックできるか検証

こんばんは、水戸スヤです。
今日はMS Accessを使用する場合に、
DDL(Create、Alter、Dropなどのテーブル構造の変更命令)をした場合に、
ロールバックできるかの検証をします。

Oracleの場合は、DDLやTRUNCATEの命令はロールバックできません。
よって構造の変更をプログラムで行うのはリスキーと言えるでしょう。

ではMS Accessの場合はどうでしょう。
ググッた感じだとPostgreSQLやMySQLはいけるっぽいですね。
Accessはヒットしないので、検証してみます。

まず下記のようなテーブル構成のAccessファイルを用意します。

  • TABLE1
  • TABLE2

上記のファイルに対して、OleDb経由で接続し、

  • DROP TABLE
  • ALTER TABLE
  • CREATE TABLE

を実行してみます。
まずちゃんと動いてることの確認。


サンプルソース


/// <summary>
/// Create Alter Drop などでRollbackが効くのか検証
/// </summary>
public void DDLRollbackTest()
{
    using (OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\file\example.accdb"))
    {
        con.Open();
        using (OleDbCommand cmd = new OleDbCommand())
        {
            OleDbTransaction tran = con.BeginTransaction();
            try
            {
                cmd.Transaction = tran;
                cmd.Connection = con;

                // Drop Table
                cmd.CommandText = "DROP TABLE TABLE1";
                cmd.ExecuteNonQuery();

                // Alter Table
                cmd.CommandText = "ALTER TABLE TABLE2 ADD COLUMN1 DATE";
                cmd.ExecuteNonQuery();

                // Create Table
                cmd.CommandText = "CREATE TABLE TABLE3 (COLUMN1 DATE)";
                cmd.ExecuteNonQuery();

                //tran.Rollback();
                tran.Commit();
            }
            catch
            {
                tran.Rollback();
                throw;
            }
            finally
            {
                if (con != null)
                {
                    con.Close();
                }
            }
        }
    }
}

一回目は例外なく動くことを確認したいので、

//tran.Rollback();

としています。
では実行してみましょう。
ファイルを開いてみると、

正常に定義変更されている

  • TABLE1が削除されること
  • TABLE2に列CULUMN1が追加されること
  • TABLE3が追加されること

が確認できると思います。

では本題。
先ほどのソースのCommitを止め、Rollbackに変更します。

//tran.Rollback();
tran.Commit();

tran.Rollback();

そして実行。

ロールバックしていることが確認できる

  • TABLE1が削除されないこと
  • TABLE2に列CULUMN1が追加されないこと
  • TABLE3が追加されないこと

が確認できました。
ちゃんとロールバックされていましたね。

MS AccessもDDLの操作がロールバックできるようですね。

参考までに。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です