{"record":{"id":"ee8bbd9294135f3e","repo":"pentaho/pentaho-kettle","slug":"synchronizeaftermergemeta-exception-ee8bbd","errorCode":null,"errorMessage":"SynchronizeAfterMergeMeta.Exception.UnableToSaveStepInfoToRepository","messagePattern":"SynchronizeAfterMergeMeta\\.Exception\\.UnableToSaveStepInfoToRepository","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/synchronizeaftermerge/SynchronizeAfterMergeMeta.java","lineNumber":630,"sourceCode":"      for ( int i = 0; i < keyStream.length; i++ ) {\n        rep.saveStepAttribute( id_transformation, id_step, i, \"key_name\", keyStream[i] );\n        rep.saveStepAttribute( id_transformation, id_step, i, \"key_field\", keyLookup[i] );\n        rep.saveStepAttribute( id_transformation, id_step, i, \"key_condition\", keyCondition[i] );\n        rep.saveStepAttribute( id_transformation, id_step, i, \"key_name2\", keyStream2[i] );\n      }\n\n      for ( int i = 0; i < updateLookup.length; i++ ) {\n        rep.saveStepAttribute( id_transformation, id_step, i, \"value_name\", updateLookup[i] );\n        rep.saveStepAttribute( id_transformation, id_step, i, \"value_rename\", updateStream[i] );\n        rep.saveStepAttribute( id_transformation, id_step, i, \"value_update\", update[i].booleanValue() );\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, \"SynchronizeAfterMergeMeta.Exception.UnableToSaveStepInfoToRepository\" )\n        + id_step, e );\n    }\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 ) {\n      Database db = new Database( loggingObject, databaseMeta );\n      db.shareVariablesWith( transMeta );\n      try {\n        db.connect();\n\n        if ( !Utils.isEmpty( tableName ) ) {","sourceCodeStart":612,"sourceCodeEnd":648,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/synchronizeaftermerge/SynchronizeAfterMergeMeta.java#L612-L648","documentation":"SynchronizeAfterMergeMeta.saveRep() failed while persisting the step's settings to the repository (KettleException 'Unable to save step info to repository' + id_step). Any exception during attribute writes or insertStepDatabase is wrapped and rethrown, leaving the transformation partially saved.","triggerScenarios":"Repository insert fails while saving the step: DB connection lost, insufficient write permission, constraint violation, or database read-only mode during save of a transformation containing this step.","commonSituations":"Repository DB credentials lacking INSERT privileges; repository database in read-only/locked state; storage quota or connectivity failure on the repository server.","solutions":["Verify the repository user has INSERT/UPDATE privileges on the repository tables","Check repository DB connectivity and retry the save","Inspect the 'Caused by' exception to identify the failing SQL statement","Free space / unlock the repository database if it is read-only or out of quota"],"exampleFix":"// before: user lacks privilege -> save fails\nGRANT INSERT, UPDATE, DELETE ON R_STEP_ATTRIBUTE TO pdi_user;\n// then retry saving the transformation in Spoon","handlingStrategy":"try-catch","validationCode":"// before saveRep\nif (!repository.isConnected()) throw new IllegalStateException(\"Repository not connected\");\n// verify write access\nrepository.getCountStepAttribute(id_step, \"value_name\", 0); // probe read; ensure user has write grants via DB check","typeGuard":null,"tryCatchPattern":"try { stepMeta.saveRep(repository, metaStore, idTrans, idStep); }\ncatch (KettleException e) { log.error(\"Repository save failed for step \" + idStep + \" — check grants/connection: \" + e.getMessage(), e.getCause()); throw e; }","preventionTips":["Grant the PDI repository user INSERT/UPDATE/DELETE privileges","Avoid saving during repository maintenance/read-only windows","Test repository connectivity before batch saves","Monitor repository disk space"],"tags":["kettle","repository","database-write","persistence"],"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"}