質問

データベース スキーマを定期的に更新するプログラムがあります。場合によっては、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 を実行します。これは SQL Server ではうまく機能しますが、Oracle では望ましい効果がありません。Oracle は、各 DDL ステートメントの後に暗黙的な COMMIT を実行するようです。

ありますか どれでも この暗黙的なコミットをオフにする方法は?

役に立ちましたか?

解決

これをオフにすることはできません。テーブルがすでに存在する場合などにテーブルを削除するようにスクリプトを設計することで、非常に簡単に回避できます。

FLASHBACKデータベースの使用を検討してください。これはスキーマ/オブジェクトレベルで実行できると思いますが、それを確認するにはドキュメントを確認してください。それが機能するには、10G を使用する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top