Oracle スキーマの更新をトランザクションでラップする
-
09-06-2019 - |
質問
データベース スキーマを定期的に更新するプログラムがあります。場合によっては、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 を実行するようです。
- 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
ありますか どれでも この暗黙的なコミットをオフにする方法は?
解決
これをオフにすることはできません。テーブルがすでに存在する場合などにテーブルを削除するようにスクリプトを設計することで、非常に簡単に回避できます。
FLASHBACKデータベースの使用を検討してください。これはスキーマ/オブジェクトレベルで実行できると思いますが、それを確認するにはドキュメントを確認してください。それが機能するには、10G を使用する必要があります。
所属していません StackOverflow