pentaho/pentaho-kettle · error · KettleException

SynchronizeAfterMergeMeta.Exception.TableNotSpecified

Error message

SynchronizeAfterMergeMeta.Exception.TableNotSpecified

What it means

Thrown by SynchronizeAfterMergeMeta.getTableFieldsMeta when the step's target table name resolves to empty/null, so the field metadata lookup cannot even be attempted. The library requires a concrete table name to query field layout from the database.

Solutions

  1. Open the Synchronize After Merge step dialog and set the Target table field
  2. Verify the variable used for the table name is defined in the runtime environment/transformation properties
  3. Re-check the transformation XML/repository entry to ensure <table> is persisted
  4. Add a default table name in setDefault() or validation before calling getTableFieldsMeta

Example fix

// before
meta.setTablename("${TABLE_NAME}"); // variable never defined
// after
meta.setTablename("customers"); // or ensure variables.xml defines TABLE_NAME
Defensive patterns

Strategy: validation

Validate before calling

if (meta.getTablename() == null || meta.getTablename().trim().isEmpty()) { throw new IllegalArgumentException("Synchronize After Merge: target table must be set"); }

Try / catch

try { fields = meta.getTableFieldsMeta(row, realSchema, realTable); } catch (KettleException e) { logError("Table not specified or lookup failed: " + e.getMessage()); }

Prevention

When it happens

Trigger: Calling getTableFieldsMeta() while the step's tablename field (after variable resolution) is null or empty string; a transformation saved without the table field populated.

Common situations: Transformation XML lost the table value during export/import; user filled schema but left table blank in the Synchronize After Merge dialog; variable bound to ${TABLE_NAME} not defined in the runtime environment.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/synchronizeaftermerge/SynchronizeAfterMergeMeta.java:1051

  public RowMetaInterface getRequiredFields( VariableSpace space ) throws KettleException {
    String realTableName = space.environmentSubstitute( tableName );
    String realSchemaName = space.environmentSubstitute( schemaName );

    if ( databaseMeta != null ) {
      Database db = new Database( loggingObject, databaseMeta );
      try {
        db.connect();

        if ( !Utils.isEmpty( realTableName ) ) {
          // Check if this table exists...
          if ( db.checkTableExists( realSchemaName, realTableName ) ) {
            return db.getTableFieldsMeta( realSchemaName, realTableName );
          } else {
            throw new KettleException( BaseMessages.getString(
              PKG, "SynchronizeAfterMergeMeta.Exception.TableNotFound" ) );
          }
        } else {
          throw new KettleException( BaseMessages.getString(
            PKG, "SynchronizeAfterMergeMeta.Exception.TableNotSpecified" ) );
        }
      } catch ( Exception e ) {
        throw new KettleException( BaseMessages.getString(
          PKG, "SynchronizeAfterMergeMeta.Exception.ErrorGettingFields" ), e );
      } finally {
        db.close();
      }
    } else {
      throw new KettleException( BaseMessages.getString(
        PKG, "SynchronizeAfterMergeMeta.Exception.ConnectionNotDefined" ) );
    }

  }

  /**
   * @return the schemaName
   */

View on GitHub (pinned to f3058517a1)