{"record":{"id":"35e3122bb9fa3290","repo":"apache/seatunnel","slug":"unable-to-find-table-in-relational-model-tableid","errorCode":null,"errorMessage":"Unable to find table in relational model: <tableId>","messagePattern":"Unable to find table in relational model: <tableId>","errorType":"exception","errorClass":"DebeziumException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-cdc/connector-cdc-oracle/src/main/java/io/debezium/connector/oracle/logminer/LogMinerStreamingChangeEventSource.java","lineNumber":891,"sourceCode":"                                \"Database table '{}' no longer exists, supplemental log check skipped\",\n                                tableId);\n                    } else if (!isTableAllColumnsSupplementalLoggingEnabled(connection, tableId)) {\n                        LOGGER.warn(\n                                \"Database table '{}' not configured with supplemental logging \\\"(ALL) COLUMNS\\\"; \"\n                                        + \"only explicitly changed columns will be captured. \"\n                                        + \"Use: ALTER TABLE {}.{} ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS\",\n                                tableId,\n                                tableId.schema(),\n                                tableId.table());\n                    }\n                    final Table table = schema.tableFor(tableId);\n                    if (table == null) {\n                        // This should never happen; however in the event something would cause it\n                        // we can\n                        // at least get the table identifier thrown in the error to debug from\n                        // rather\n                        // than an erroneous NPE\n                        throw new DebeziumException(\n                                \"Unable to find table in relational model: \" + tableId);\n                    }\n                    checkTableColumnNameLengths(table);\n                }\n            } else {\n                // ALL supplemental logging is enabled, now check table/column lengths\n                for (TableId tableId : schema.tableIds()) {\n                    final Table table = schema.tableFor(tableId);\n                    if (table == null) {\n                        // This should never happen; however in the event something would cause it\n                        // we can\n                        // at least get the table identifier thrown in the error to debug from\n                        // rather\n                        // than an erroneous NPE\n                        throw new DebeziumException(\n                                \"Unable to find table in relational model: \" + tableId);\n                    }\n                    checkTableColumnNameLengths(table);","sourceCodeStart":873,"sourceCodeEnd":909,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-cdc/connector-cdc-oracle/src/main/java/io/debezium/connector/oracle/logminer/LogMinerStreamingChangeEventSource.java#L873-L909","documentation":"In checkDatabaseAndTableState, when only MIN supplemental logging is enabled, the connector iterates each captured tableId and looks it up in the loaded relational model (schema.tableFor). If the lookup returns null, the table expected by the connector configuration is absent from the in-memory schema, and this DebeziumException is thrown (instead of a later NPE) to aid debugging.","triggerScenarios":"execute -> checkDatabaseAndTableState -> schema.tableFor(tableId) returns null for a tableId in the captured schema — the relational model was built before/without that table, or the table was dropped/renamed between snapshot and streaming.","commonSituations":"Table dropped or renamed in Oracle after the snapshot but still listed via table include/exclude config; signal-based incremental snapshot referencing a table not in the relational model; schema history topic out of sync with the database; case-sensitivity mismatch in quoted identifiers.","solutions":["Confirm the table still exists in Oracle and matches the connector's table include/exclude filters exactly (schema and name, case-sensitive).","Verify the database schema history topic is intact and in sync; if corrupted, stop connector, fix history topic/recovery, and restart.","Re-run a snapshot for the missing table (or remove it from the capture list if intentionally dropped).","Check identifier casing: unquoted Oracle names are uppercase; ensure config uses ORACLE.TABLE.NAME casing that resolves to the same TableId."],"exampleFix":"// before: table.include.list references a renamed table\n\"table.include.list\": \"INVENTORY.ORDERS\"\n// after: match the actual current table name\n\"table.include.list\": \"INVENTORY.CUSTOMER_ORDERS\"","handlingStrategy":"validation","validationCode":"-- confirm every configured table exists and is in the captured model\nSELECT owner, table_name FROM all_tables\n WHERE owner || '.' || table_name IN (:configuredTableIds);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep table.include.list in sync with actual Oracle table names and casing","Guard the schema history topic from corruption and monitor its recovery","Remove dropped/renamed tables from the capture list before restarting","Prefer database-level (ALL) COLUMNS supplemental logging to skip this table-by-table branch"],"tags":["oracle","cdc","logminer","schema","table-not-found"],"backgroundTag":"resource-not-found","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}