Обернуть обновление схемы Oracle в транзакцию
-
09-06-2019 - |
Вопрос
У меня есть программа, которая периодически обновляет схему своей базы данных.Иногда один из операторов 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:
- 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.