2008-09-12 6 views
4

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

Есть любого способа отключить это неявное обязательство?

+1

Oracle выпускает COMMIT перед каждым оператором DDL, а также после него. – APC 2009-09-12 16:42:00

ответ

6

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

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