Question

J'ai un programme qui met périodiquement à jour son schéma de base de données.Parfois, l'une des instructions DDL peut échouer et si c'est le cas, je souhaite annuler toutes les modifications.J'enveloppe la mise à jour dans une transaction comme ceci :

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;

Pendant l'exécution, si l'une des instructions échoue, j'effectue un ROLLBACK au lieu d'un COMMIT.Cela fonctionne très bien sur SQL Server, mais n'a pas l'effet souhaité sur Oracle.Oracle semble faire un COMMIT implicite après chaque instruction DDL :

Y a-t-il n'importe lequel un moyen de désactiver cette validation implicite ?

Était-ce utile?

La solution

Vous ne pouvez pas désactiver cela.Assez facile à contourner en concevant vos scripts pour supprimer des tables au cas où elles existent déjà, etc...

Vous pouvez envisager d'utiliser la base de données FLASHBACK, je pense que vous pouvez le faire au niveau schéma/objet, mais consultez la documentation pour le confirmer.Il faudrait être en 10G pour que cela fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top