pentaho/pentaho-kettle · error · KettleException
Unable to save step information to the repository for…
Error message
Unable to save step information to the repository for id_step=" + id_step
What it means
SQLFileOutputMeta.saveRep() persists the step's configuration to the Pentaho Repository (saveStepAttribute, saveDatabaseMetaStepAttribute, insertStepDatabase) and wraps any failure in KettleException 'Unable to save step information to the repository for id_step=<id>'. The failure means the step's settings were NOT saved even though the user clicked save.
Solutions
- Read the chained cause to find the failing repository write (attribute insert vs insertStepDatabase)
- Restore repository database connectivity/permissions, then re-save the transformation from Spoon
- Recreate the missing shared database connection before saving the step
- Use 'Export to XML' as a workaround to preserve the step settings until the repository is fixed
Example fix
// before: saving while referenced connection row was deleted (FK error) DELETE FROM r_database WHERE name='PROD_DB'; // after: keep the connection, or re-link the step to an existing one first -- do not delete; instead update the step to use an existing connection
Defensive patterns
Strategy: try-catch
Validate before calling
// Ensure repository is writable and referenced connections exist before save: rep.getConnection().setReadOnly( false ); ObjectId connId = rep.getDatabaseID( meta.getDatabaseMeta() ); if ( connId == null ) throw new IllegalStateException( "Referenced DB connection missing in repository" );
Try / catch
try {
repository.save( transMeta, versionComment, null, monitor );
} catch ( KettleException e ) {
if ( e.getMessage().startsWith( "Unable to save step information" ) ) {
log.error( "Save failed for id_step: {}", e.getCause() );
// export to XML so work is not lost, fix repo, re-save
}
} Prevention
- Verify repository write permissions before editing sessions
- Don't delete shared DB connections still used by steps
- Monitor repository DB disk space
- Export transformations to XML as a save fallback
When it happens
Trigger: Saving a transformation to a repository while the repository database connection is broken, the r_step_attribute table is read-only or lacks permissions, a foreign-key constraint fails (e.g. the referenced database connection row is gone), or the transaction is rolled back.
Common situations: Repository DB credentials/password rotated mid-session; read-only replica used as the repository; disk full on the repository database; deleting a shared DB connection that the step still references (FK failure on id_connection).
Related errors
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- ERROR_0002
- HTTPMeta.Exception.UnableToSaveStepInfo
- JobEntryEval.UnableToSaveToRepo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/96005eacfb26b675.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/sqlfileoutput/SQLFileOutputMeta.java:572
rep.saveStepAttribute( id_transformation, id_step, "file_name", fileName );
rep.saveStepAttribute( id_transformation, id_step, "file_extention", extension );
rep.saveStepAttribute( id_transformation, id_step, "file_append", fileAppended );
rep.saveStepAttribute( id_transformation, id_step, "file_split", splitEvery );
rep.saveStepAttribute( id_transformation, id_step, "file_add_stepnr", stepNrInFilename );
rep.saveStepAttribute( id_transformation, id_step, "file_add_partnr", partNrInFilename );
rep.saveStepAttribute( id_transformation, id_step, "file_add_date", dateInFilename );
rep.saveStepAttribute( id_transformation, id_step, "file_add_time", timeInFilename );
rep.saveStepAttribute( id_transformation, id_step, "create_parent_folder", createparentfolder );
rep.saveStepAttribute( id_transformation, id_step, "DoNotOpenNewFileInit", DoNotOpenNewFileInit );
// Also, save the step-database relationship!
if ( databaseMeta != null ) {
rep.insertStepDatabase( id_transformation, id_step, databaseMeta.getObjectId() );
}
} catch ( Exception e ) {
throw new KettleException( "Unable to save step information to the repository for id_step=" + id_step, e );
}
}
public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,
RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,
Repository repository, IMetaStore metaStore ) {
if ( databaseMeta != null ) {
CheckResult cr =
new CheckResult( CheckResult.TYPE_RESULT_OK, BaseMessages.getString(
PKG, "SQLFileOutputMeta.CheckResult.ConnectionExists" ), stepMeta );
remarks.add( cr );
Database db = new Database( loggingObject, databaseMeta );
try {
db.connect();
cr =
new CheckResult( CheckResult.TYPE_RESULT_OK, BaseMessages.getString(View on GitHub (pinned to f3058517a1)