最近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使いからすると意外な機能でした。
他のデータベースではどうなっているのか気になります。