Обернуть обновление схемы Oracle в транзакцию

StackOverflow https://stackoverflow.com/questions/59303

  •  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:

Есть любой способ отключить эту неявную фиксацию?

Это было полезно?

Решение

Вы не можете отключить это.Довольно легко обойти это, разработав свои сценарии для удаления таблиц, если они уже существуют, и т. д.

Вы можете посмотреть использование базы данных FLASHBACK. Я считаю, что вы можете сделать это на уровне схемы/объекта, но проверьте документацию, чтобы подтвердить это.Чтобы это работало, вам нужно будет использовать 10G.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top