{"record":{"id":"d078c3fd6d69d81b","repo":"pentaho/pentaho-kettle","slug":"orabulkloadermeta-exception-unabletosavestepinfotorepository","errorCode":null,"errorMessage":"OraBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository","messagePattern":"OraBulkLoaderMeta\\.Exception\\.UnableToSaveStepInfoToRepository","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/oracle-bulk-loader/impl/src/main/java/org/pentaho/di/trans/steps/orabulkloader/OraBulkLoaderMeta.java","lineNumber":609,"sourceCode":"\n      rep.saveStepAttribute( id_transformation, id_step, \"character_set\", characterSetName );\n      rep.saveStepAttribute( id_transformation, id_step, \"fail_on_warning\", failOnWarning );\n      rep.saveStepAttribute( id_transformation, id_step, \"fail_on_error\", failOnError );\n      rep.saveStepAttribute( id_transformation, id_step, \"parallel\", parallel );\n      rep.saveStepAttribute( id_transformation, id_step, \"alt_rec_term\", altRecordTerm );\n\n      for ( int i = 0; i < fieldTable.length; i++ ) {\n        rep.saveStepAttribute( id_transformation, id_step, i, \"stream_name\", fieldTable[i] );\n        rep.saveStepAttribute( id_transformation, id_step, i, \"field_name\", fieldStream[i] );\n        rep.saveStepAttribute( id_transformation, id_step, i, \"date_mask\", dateMask[i] );\n      }\n\n      // Also, save the step-database relationship!\n      if ( databaseMeta != null ) {\n        rep.insertStepDatabase( id_transformation, id_step, databaseMeta.getObjectId() );\n      }\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString(\n        PKG, \"OraBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository\" )\n        + id_step, e );\n    }\n  }\n\n  @Override\n  public void getFields( Bowl bowl, RowMetaInterface rowMeta, String origin, RowMetaInterface[] info, StepMeta nextStep,\n    VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {\n    // Default: nothing changes to rowMeta\n  }\n\n  public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,\n                    RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,\n                    Repository repository, IMetaStore metaStore ) {\n    CheckResult cr;\n    String error_message = \"\";\n\n    if ( databaseMeta != null ) {","sourceCodeStart":591,"sourceCodeEnd":627,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/oracle-bulk-loader/impl/src/main/java/org/pentaho/di/trans/steps/orabulkloader/OraBulkLoaderMeta.java#L591-L627","documentation":"saveRep() persists the step's settings to the repository; any Exception is wrapped in a KettleException with OraBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository plus id_step. The step-database relationship insert (insertStepDatabase) and attribute writes are the usual sources. The transformation is not saved for this step until fixed.","triggerScenarios":"rep.saveStepAttribute*/insertStepDatabase throws during saveRep — repository connection loss, read-only repository user, constraint violation, or duplicate object ids.","commonSituations":"Saving a transformation with a repository user lacking INSERT/UPDATE privileges; network drop to the repository database mid-save; saving to a read-only production repository; stale repository sessions after timeouts.","solutions":["Check the cause chain and repository logs for the underlying SQL/privilege error","Ensure the repository user has write privileges on the repository tables","Test/re-establish the repository connection and retry the save","If the repository is intentionally read-only, save the transformation as a local .ktr file instead"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// ensure the repository user can write before saving\n// (run a probe write or check grants in the repository DB)\nrep.insertStepDatabase( id_transformation, id_step, dbMeta.getObjectId() ); // will throw if not writable","typeGuard":null,"tryCatchPattern":"try {\n  transMeta.saveRep( rep, metaStore, \"transformation-name\" );\n} catch ( KettleException e ) {\n  if ( e.getMessage().contains( \"UnableToSaveStepInfoToRepository\" ) ) {\n    // fall back to saving as a local .ktr file\n  }\n}","preventionTips":["Use a repository account with INSERT/UPDATE grants","Check network stability to the repository DB for large saves","Fall back to local .ktr export when working against read-only repositories"],"tags":["repository","database-write","metadata","kettle"],"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"}