Moin!
Ich programmiere ein Migrationstool, das eine Oracle-Datenbank auf die gewünschte Versionierung bringen soll. Dazu werden SQL-Skripte aufgerufen, die teilweise mehrere DML- und DDL-Kommandos enthalten. Ein Skript gilt als eine Transaktion und es soll daher im Falle eines Fehlers ein Rollback erfolgen, wird das Skript aber erfolgreich ausgeführt, wird die DB-Versionsnummer geupdatet, es sei denn, das Tool läuft im Validationsmodus, dann erfolgt auch bei Erfolg ein Rollback.
Ich verwende JDBC und setzte AutoCommit auf false. Leider hat Oracle die blöde Eigenschaft, dass alle DDL-Statements automatisch commited werden, unabhängig vom AutoCommit-flag. Daher möchte ich gerne SavePoints setzen. Wenn ich es richtig verstehe, wird die DB im Falle eines rollback(savepoint) auf genau diesen Zustand zurückgesetzt, also auch alle DDL-Statements, oder?
Genau dies tue ich in den beiden folgenden Methode. Bevor ich ein Skript ausführe, setze ich einen Savepoint, denn ich dann im Falle eines rollbacks mit übergebe. Allerdings erhalte ich jedesmal die Fehlermeldung
"ORA-01086: Savepoint 'ORACLE_SVPT_3' wurde nicht festgelegt".
Hat irgendmand eine Idee, woran das liegen könnte? Übersehe ich einen dummen Fehler im Code?
Tausend Dank...
-------------------------
public boolean executeSQLScript (File script)
{
Savepoint save = setSavepoint();
boolean success = save == null? false : true;
boolean executed = false;
for (String sqlCommand : sqlCommands)
{
if (success)
{
if (!sqlCommand.contains("DBVERSION"))
{
success = executeSQL(sqlCommand);
executed = true;
}
}
}
if (success)
{
if (app.isValidate())
{
success = executed ? rollbackTransaction(save) : success;
}
else
{
success = updateDBVersion(newVersion);
}
}
else
{
if (app.isValidate())
{
MigrationToolApplication.LOGGER.output("Validation of script " + script.getName() + " couldn't be finished. Some errors occured.");
}
else
{
MigrationToolApplication.LOGGER.output("Execution of script " + script.getName() + " incorrect. Some errors occured.");
}
MigrationToolApplication.LOGGER.output("Rolling back transactions...");
rollbackTransaction(save);
}
return success;
}
private Savepoint setSavepoint()
{
try
{
MigrationToolApplication.LOGGER.output("Setting savepoint of data base for commit/rollback.");
return connect.setSavepoint();
}
catch (SQLException e)
{
MigrationToolApplication.LOGGER.output("Error during savepoint setting.");
MigrationToolApplication.LOGGER.output(e.getMessage());
return null;
}
}