梅林日記

雑用系プログラマの趣味とお仕事

目次

Blog 利用状況

ニュース

資格

MCAD OCP

書庫

日記カテゴリ

SQL ServerとOracle (その1) : DDLとトランザクション

最近SQL Server 2005の勉強をしているのですが、今まで仕事で関わってきたOracleと比較すると

色々異なる点がありそうなので、ネタにしてみようと思います。

 

一つ目はDDLとトランザクションの関係について。

 

DDLとは、表やビュー、ストアドプロシージャなどのデータベース・スキーマオブジェクトを

新規に作成したり、変更や削除を行うためのSQLコマンドで、例としては

(表の作成) CREATE TABLE table1 (id INT, value VARCHAR(50))

(表の変更) ALTER TABLE table1 ADD CONSTRAINT pk_table1 PRIMARY KEY (id)

(表の削除) DROP TABLE table1

などが挙げられます。

 

ここで、トランザクション内でDDLを発行する場合について考えます。

 

Oracleでは、DDLが発行されるとトランザクションが暗黙でコミットされるため、ロールバックすることができません。

一方SQL Serverでは、DDLもINSERT/UPDATE/DELETEなどのDMLと同様に、ロールバックすることができるようです。


BEGIN TRAN
  CREATE TABLE test1(id INT, value VARCHAR(50))
  INSERT INTO test1(id, value) VALUES(1, 'Hello World!')
  SELECT * FROM test1
ROLLBACK TRAN
go

(1 件処理されました)
 id          value                                             
 ----------- --------------------------------------------------
           1 Hello World!                                      

(1 件処理されました)

SELECT * FROM test1
go

メッセージ 208、レベル 16、状態 1、サーバー xxxxx、行 2
オブジェクト名 'test1' が無効です。


Oracle使いからすると意外な機能でした。

他のデータベースではどうなっているのか気になります。

投稿日時 : 2007年2月23日 1:33

コメントを追加

# re: SQL ServerとOracle (その1) : DDLとトランザクション 2008/01/22 10:04 ふるふる

Googleから来ました。

SQL Server 2000で開発して、テスト環境へインストールするとき(本番、テスト、開発の3つの環境があるのです)、エラーが発生すると元に戻さないといけないのですが、トランザクションにするといいですね。
オラクルを使っていたとき、DDLはコミットしちゃうのでインストールに失敗したら一つ一つ元に戻していかないと、としていたんで、同じようにSQL Serverでも失敗したら元に戻していました。
で、もしかしてSQL ServerでDDLもトランザクションに含むんじゃないか、と思ってググるとこのBLOGがトップでした。
(「SQLサーバー DDL トランザクション」で検索)

SQL Server2000でもDDLはトランザクションに含まれますね。 データベースを移動しても同じトランザクション内でした。

Begin Transaction
Use DevMaster;
Create table muchi(k int, c varchar(20));
Insert into muchi(1,'kurokawa');
Use DevSlave;
Create table maid(k int , c char(4));
rollback;

rollback する前に、別コネクションからSelect * from muchi しても反応しません(ロックしている)。

タイトル  
名前  
URL
コメント