2008-09-12 12 views
4

データベーススキーマを定期的に更新するプログラムがあります。時々、DDLステートメントの1つが失敗する可能性があります。もしそうであれば、すべての変更をロールバックします。私はそうのようなトランザクションで更新をラップ:私たちが実行しているとおりトランザクションでのOracleスキーマ更新のラップ

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; 

、ステートメントのいずれかが失敗した場合、私が代わりにCOMMITのROLLBACKを実行します。これはSQL Server上でうまく動作しますが、Oracleには必要な効果はありません。

が、これは、暗黙的なコミットをオフにする任意の方法あります:Oracleは、暗黙的には、各DDL文の後にCOMMITを行うように見えますか?

+1

Oracleは、各DDL文の前と後ろにCOMMITを発行します。 – APC

答えて

6

これをオフにすることはできません。あなたが既に存在するイベントのテーブルをドロップするようにスクリプトを設計することで、かなり簡単に回避できます。

FLASHBACKデータベースを使用すると、スキーマ/オブジェクトレベルでこれを行うことができますが、それを確認する。あなたはそれが働くために10Gにいる必要があります。

関連する問題