データベーススキーマを定期的に更新するプログラムがあります。場合によっては、DDLステートメントの1つが失敗することがあります。失敗した場合は、すべての変更をロールバックしたいと思います。次のようなトランザクションで更新をラップします。
BEGIN TRAN;
CREATE TABLE A (PKey int NOT NULL IDENTITY, NewFieldKey int NULL, CONSTRAINT PK_A PRIMARY KEY (PKey));
CREATE INDEX A_2 ON A (NewFieldKey);
CREATE TABLE B (PKey int NOT NULL IDENTITY, CONSTRAINT PK_B PRIMARY KEY (PKey));
ALTER TABLE A ADD CONSTRAINT FK_B_A FOREIGN KEY (NewFieldKey) REFERENCES B (PKey);
COMMIT TRAN;
実行中に、ステートメントの1つが失敗した場合、COMMITの代わりにROLLBACKを実行します。これはSQLServerではうまく機能しますが、Oracleでは望ましい効果がありません。Oracleは、各DDLステートメントの後に暗黙のCOMMITを実行するようです。
- http://www.orafaq.com/wiki/SQL_FAQ#What_are_the_difference_between_DDL.2C_DML_and_DCL_commands.3F
- http://infolab.stanford.edu/~ullman/fcdb/oracle/or-nonstandard.html#transactions
この暗黙のコミットをオフにする方法はありますか?