Domanda

Ho un programma che aggiorna periodicamente il suo schema del database.A volte, una delle istruzioni DDL potrebbe fallire e, in tal caso, voglio ripristinare tutte le modifiche.Avvolgo l'aggiornamento in una transazione in questo modo:

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;

Mentre stiamo eseguendo, se una delle istruzioni fallisce, eseguo un ROLLBACK invece di un COMMIT.Funziona benissimo su SQL Server, ma non ha l'effetto desiderato su Oracle.Oracle sembra eseguire un COMMIT implicito dopo ogni istruzione DDL:

È lì Qualunque modo per disattivare questo commit implicito?

È stato utile?

Soluzione

Non puoi disattivarlo.Abbastanza facile da aggirare progettando i tuoi script per eliminare le tabelle nel caso in cui esistano già, ecc...

Puoi provare a utilizzare il database FLASHBACK, credo che tu possa farlo a livello di schema/oggetto ma controlla i documenti per confermarlo.Dovresti essere su 10G affinché funzioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top