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

  1. Read the chained cause to find the failing repository write (attribute insert vs insertStepDatabase)
  2. Restore repository database connectivity/permissions, then re-save the transformation from Spoon
  3. Recreate the missing shared database connection before saving the step
  4. 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

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


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)