{"record":{"id":"8f1e0f4738ad4eb7","repo":"pentaho/pentaho-kettle","slug":"unable-to-save-step-information-to-the-repository-id-step-id","errorCode":null,"errorMessage":"Unable to save step information to the repository, id_step=<id_step>","messagePattern":"Unable to save step information to the repository, id_step=<id_step>","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/dummy/core/src/main/java/org/pentaho/di/be/ibridge/kettle/dummy/DummyPluginMeta.java","lineNumber":177,"sourceCode":"      }\n    } catch ( KettleDatabaseException dbe ) {\n      throw new KettleException( \"error reading step with id_step=\" + id_step + \" from the repository\", dbe );\n    } catch ( Exception e ) {\n      throw new KettleException( \"Unexpected error reading step with id_step=\" + id_step + \" from the repository\", e );\n    }\n  }\n\n  @Override\n  public void saveRep( Repository rep, ObjectId id_transformation, ObjectId id_step ) throws KettleException {\n    try {\n      rep.saveStepAttribute( id_transformation, id_step, \"value_name\", value.getValueMeta().getName() );\n      rep.saveStepAttribute( id_transformation, id_step, 0, \"value_type\", value.getValueMeta().getTypeDesc() );\n      rep.saveStepAttribute( id_transformation, id_step, 0, \"value_text\", value.getValueMeta().getString( value.getValueData() ) );\n      rep.saveStepAttribute( id_transformation, id_step, 0, \"value_null\", value.getValueMeta().isNull( value.getValueData() ) );\n      rep.saveStepAttribute( id_transformation, id_step, 0, \"value_length\", value.getValueMeta().getLength() );\n      rep.saveStepAttribute( id_transformation, id_step, 0, \"value_precision\", value.getValueMeta().getPrecision() );\n    } catch ( KettleDatabaseException dbe ) {\n      throw new KettleException( \"Unable to save step information to the repository, id_step=\" + id_step, dbe );\n    }\n  }\n\n  @Override\n  public void check( List<CheckResultInterface> remarks, TransMeta transmeta, StepMeta stepMeta, RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info ) {\n    CheckResult cr;\n    if ( prev == null || prev.size() == 0 ) {\n      cr = new CheckResult( CheckResult.TYPE_RESULT_WARNING, \"Not receiving any fields from previous steps!\", stepMeta );\n      remarks.add( cr );\n    } else {\n      cr = new CheckResult( CheckResult.TYPE_RESULT_OK, \"Step is connected to previous one, receiving \" + prev.size() + \" fields\", stepMeta );\n      remarks.add( cr );\n    }\n\n    // See if we have input streams leading to this step!\n    if ( input.length > 0 ) {\n      cr = new CheckResult( CheckResult.TYPE_RESULT_OK, \"Step is receiving info from other steps.\", stepMeta );\n      remarks.add( cr );","sourceCodeStart":159,"sourceCodeEnd":195,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/dummy/core/src/main/java/org/pentaho/di/be/ibridge/kettle/dummy/DummyPluginMeta.java#L159-L195","documentation":"DummyPluginMeta.saveRep writes the step's value metadata and text into repository step attributes. If any rep.saveStepAttribute call throws KettleDatabaseException (insert/update failure against the repository DB), it is rethrown as a KettleException with this message plus id_step. Note saveRep also assumes value is non-null, so an internal NPE would not produce this message.","triggerScenarios":"saveRep(rep, id_transformation, id_step) failing on any of the saveStepAttribute calls: repository DB down, transaction/lock conflict, read-only repository account, attribute value exceeding column size, or DB constraint violation.","commonSituations":"Repository DB out of disk space or in read-only mode; saving a transformation with credentials lacking INSERT/UPDATE rights on R_STEP_ATTRIBUTE; unique-constraint collisions after concurrent saves; connection dropped mid-save.","solutions":["Check the chained KettleDatabaseException/JDBC cause for the precise DB error (permissions, constraint, connectivity).","Verify the repository user has write (INSERT/UPDATE) privileges on the step-attribute tables.","Test repository connectivity and DB disk space; retry saving after fixing.","Ensure the Dummy step's value is set (open the dialog and confirm) so saveRep has valid metadata to write."],"exampleFix":"// before: read-only repo user\nGRANT SELECT ON R_STEP_ATTRIBUTE TO pdi_user;\n// after: grant write access\nGRANT SELECT, INSERT, UPDATE, DELETE ON R_STEP_ATTRIBUTE TO pdi_user;","handlingStrategy":"try-catch","validationCode":"// ensure the step has a value and the repo is writable before save\nif ( meta.getValue() == null ) {\n  meta.setDefault(); // supplies 123.456 Number default\n}\n// probe write access\nrep.saveStepAttribute( id_transformation, id_step, 0, \"probe_attr\", \"ok\" );","typeGuard":null,"tryCatchPattern":"try {\n  meta.saveRep( rep, id_transformation, id_step );\n} catch ( KettleException e ) {\n  Throwable cause = e.getCause();\n  if ( cause instanceof KettleDatabaseException ) {\n    logError( \"Repository write failed for id_step=\" + id_step + \": \" + cause.getMessage() );\n    // retry after checking DB connectivity/permissions\n  }\n  throw e;\n}","preventionTips":["Grant the repository user INSERT/UPDATE/DELETE on step-attribute tables","Monitor repository DB disk space and read-only mode","Set the Dummy step's value in the dialog before saving (avoid null value NPEs)","Save transformations serially if concurrent saves cause lock conflicts"],"tags":["database","repository","write","persistence","pdi"],"backgroundTag":"database-write-failed","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}