pentaho/pentaho-kettle · error · KettleException

JobEntryMSAccessBulkLoad.Meta.UnableSave

JobEntryMSAccessBulkLoad.Meta.UnableSave

Error message

JobEntryMSAccessBulkLoad.Meta.UnableSave

What it means

KettleException thrown by JobEntryMSAccessBulkLoad.saveRep when saving the entry's per-file attributes (delimiter, target_Db, target_table, etc.) to the Pentaho repository fails with a KettleDatabaseException. The message embeds the id_job. The job entry's configuration is not persisted.

Solutions

  1. Check repository database connectivity and retry the save.
  2. Verify the repository user has write permissions on the repository tables.
  3. Coordinate with other users — concurrent saves of the same job can conflict; reload and re-save.
  4. Shorten or review attribute values (db/table/delimiter strings) if a column-length constraint is reported in the wrapped exception.
Defensive patterns

Strategy: try-catch

Try / catch

try { entry.saveRep( rep, metaStore, id_job ); } catch ( KettleException e ) { logError( "Repository save failed for job " + id_job + ": " + e.getCause(), e ); /* retry after connectivity check */ }

Prevention

When it happens

Trigger: saveRep(Repository, IMetaStore, ObjectId id_job, ...) catching KettleDatabaseException: repository DB unreachable, transaction/lock conflict, read-only repository, attribute value too long for column, or constraint violation on r_jobentry_attribute.

Common situations: Repository DB down or connection pool exhausted while saving the job; two users saving the same job concurrently; read-only repository credentials; oversized field values exceeding column widths.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/75f1e4de695b2f8b. Report an issue: GitHub.

Appendix: source

Thrown at plugins/ms-access/impl/src/main/java/org/pentaho/di/job/entries/msaccessbulkload/JobEntryMSAccessBulkLoad.java:302

    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "include_subfolders", include_subfolders );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "add_result_filenames", add_result_filenames );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "is_args_from_previous", is_args_from_previous );

      rep.saveJobEntryAttribute( id_job, getObjectId(), "limit", limit );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "success_condition", success_condition );
      // save the arguments...
      if ( source_filefolder != null ) {
        for ( int i = 0; i < source_filefolder.length; i++ ) {
          rep.saveJobEntryAttribute( id_job, getObjectId(), i, "source_filefolder", source_filefolder[i] );
          rep.saveJobEntryAttribute( id_job, getObjectId(), i, "source_wildcard", source_wildcard[i] );
          rep.saveJobEntryAttribute( id_job, getObjectId(), i, "delimiter", delimiter[i] );
          rep.saveJobEntryAttribute( id_job, getObjectId(), i, "target_Db", target_Db[i] );
          rep.saveJobEntryAttribute( id_job, getObjectId(), i, "target_table", target_table[i] );
        }
      }
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( BaseMessages.getString( PKG, "JobEntryMSAccessBulkLoad.Meta.UnableSave", ""
        + id_job, dbe.getMessage() ), dbe );
    }
  }

  /**********************************************************
   *
   * @param selectedfile
   * @param wildcard
   * @return True if the selectedfile matches the wildcard
   **********************************************************/
  private boolean GetFileWildcard( String selectedfile, String wildcard ) {
    Pattern pattern = null;
    boolean getIt = true;

    if ( !Utils.isEmpty( wildcard ) ) {
      pattern = Pattern.compile( wildcard );
      // First see if the file matches the regular expression!
      if ( pattern != null ) {

View on GitHub (pinned to f3058517a1)