{"record":{"id":"65ec944b7a4ee15e","repo":"apache/iceberg","slug":"must-specify-table-name-s","errorCode":null,"errorMessage":"Must specify table name(s)","messagePattern":"Must specify table name\\(s\\)","errorType":"validation","errorClass":"ConfigException","httpStatus":null,"severity":"error","filePath":"kafka-connect/kafka-connect/src/main/java/org/apache/iceberg/connect/IcebergSinkConfig.java","lineNumber":294,"sourceCode":"    jsonConverter.configure(\n        ImmutableMap.of(\n            JsonConverterConfig.SCHEMAS_ENABLE_CONFIG,\n            false,\n            ConverterConfig.TYPE_CONFIG,\n            ConverterType.VALUE.getName()));\n\n    validate();\n  }\n\n  private void validate() {\n    checkState(!catalogProps().isEmpty(), \"Must specify Iceberg catalog properties\");\n    if (tables() != null) {\n      checkState(!dynamicTablesEnabled(), \"Cannot specify both static and dynamic table names\");\n    } else if (dynamicTablesEnabled()) {\n      checkState(\n          tablesRouteField() != null, \"Must specify a route field if using dynamic table names\");\n    } else {\n      throw new ConfigException(\"Must specify table name(s)\");\n    }\n  }\n\n  private void checkState(boolean condition, String msg) {\n    if (!condition) {\n      throw new ConfigException(msg);\n    }\n  }\n\n  public String connectorName() {\n    return originalProps.get(NAME_PROP);\n  }\n\n  public String taskId() {\n    return originalProps.get(TASK_ID);\n  }\n\n  public String transactionalSuffix() {","sourceCodeStart":276,"sourceCodeEnd":312,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/kafka-connect/kafka-connect/src/main/java/org/apache/iceberg/connect/IcebergSinkConfig.java#L276-L312","documentation":"IcebergSinkConfig.validate throws ConfigException when neither static table names nor dynamic table routing is configured. The Iceberg Kafka Connect sink requires at least one of iceberg.tables or iceberg.tables.dynamic-enabled with a route field.","triggerScenarios":"Creating an IcebergSinkConfig (connector start) with iceberg.tables unset and iceberg.tables.dynamic-enabled=false (default).","commonSituations":"Missing iceberg.tables property in the connector config; typo in the property name; enabling dynamic routing but forgetting to also remove the static-list requirement path.","solutions":["Set 'iceberg.tables' to a comma-separated list of destination table names.","Or enable dynamic routing: set 'iceberg.tables.dynamic-enabled=true' and provide 'iceberg.tables.route-field'.","Verify the connector properties file uses exact property key names."],"exampleFix":"// before\n\"iceberg.catalog\": \"hadoop\"\n// after\n\"iceberg.catalog\": \"hadoop\",\n\"iceberg.tables\": \"db.table1,db.table2\"","handlingStrategy":"validation","validationCode":"// Validate connector config before submission\nif (config.get(\"iceberg.tables\") == null && !Boolean.parseBoolean(config.getOrDefault(\"iceberg.tables.dynamic-enabled\", \"false\"))) {\n  throw new IllegalArgumentException(\"set iceberg.tables or enable iceberg.tables.dynamic-enabled\");\n}","typeGuard":null,"tryCatchPattern":"try { new IcebergSinkConfig(props); } catch (org.apache.kafka.common.config.ConfigException e) { log.error(\"Sink config invalid: {}\", e.getMessage()); }","preventionTips":["Always set 'iceberg.tables' in the connector properties","Copy working connector configs as templates","Run connector config validation (connect API /validate endpoint) before deploy"],"tags":["kafka-connect","iceberg","config"],"backgroundTag":"missing-required-config-field","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}