У меня есть программа, которая периодически обновляет схему своей базы данных. Иногда может произойти сбой одного из операторов DDL, и если это произойдет, я хочу отменить все изменения. Я оборачиваю обновление в транзакцию следующим образом:
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 вместо COMMIT. Это отлично работает на SQL Server, но не оказывает желаемого эффекта на Oracle. Oracle, кажется, выполняет неявный COMMIT после каждого оператора DDL:
Есть ли способ любой отключить эту неявную фиксацию?





Вы не можете это выключить. Довольно легко обойтись, создав свои сценарии для удаления таблиц, если они уже существуют и т. д.
Вы можете посмотреть на использование базы данных FLASHBACK, я считаю, что вы можете сделать это на уровне схемы / объекта, но проверьте документы, чтобы подтвердить это. Чтобы это работало, вам потребуется 10G.
Oracle выдает COMMIT перед каждым оператором DDL, а также после него.