Pregunta

Tengo un programa que actualiza periódicamente el esquema de su base de datos.A veces, una de las declaraciones DDL puede fallar y, si falla, quiero revertir todos los cambios.Envuelvo la actualización en una transacción así:

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;

Mientras ejecutamos, si una de las declaraciones falla, hago un ROLLBACK en lugar de un COMMIT.Esto funciona muy bien en SQL Server, pero no tiene el efecto deseado en Oracle.Oracle parece hacer un COMMIT implícito después de cada declaración DDL:

Está ahí cualquier ¿Manera de desactivar este compromiso implícito?

¿Fue útil?

Solución

No puedes desactivar esto.Es bastante fácil solucionarlo diseñando sus scripts para eliminar tablas en caso de que ya existan, etc.

Puede considerar el uso de la base de datos FLASHBACK, creo que puede hacer esto a nivel de esquema/objeto, pero consulte los documentos para confirmarlo.Necesitarías estar en 10G para que eso funcione.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top