У меня есть программа, которая периодически обновляет свою схему базы данных. Иногда один из операторов DDL может выйти из строя, и если это произойдет, я хочу отменить все изменения. Я обернуть обновления в сделке, как так:Оберните обновление схемы 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;
Как мы исполняем, если один из операторов не получится, я делаю ROLLBACK вместо ПОРУЧАТЬ. Это отлично работает на SQL Server, но не имеет желаемого эффекта для Oracle. Oracle, кажется, делает неявный COMMIT после каждого оператора DDL:
- 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
Есть любого способа отключить это неявное обязательство?
Oracle выпускает COMMIT перед каждым оператором DDL, а также после него. – APC 2009-09-12 16:42:00