usuario - Ajustar una actualización de esquema de Oracle en una transacción
ver privilegios de un rol oracle (1)
Tengo un programa que periódicamente actualiza su esquema de base de datos. A veces, una de las sentencias DDL puede fallar y, si lo hace, quiero deshacer todos los cambios. Envuelvo la actualización en una transacción como esta:
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 estamos ejecutando, 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:
- 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
¿Hay alguna forma de desactivar esta confirmación implícita?
No puedes apagar esto. Bastante fácil de solucionar diseñando sus scripts para colocar tablas en caso de que ya existan, etc.
Puede ver usando la base de datos FLASHBACK, creo que puede hacer esto en el nivel de esquema / objeto pero verifique los documentos para confirmarlo. Debería estar en 10G para que funcione.