flowable/flowable-engine · error · FlowableException

No flowable tables in DB. Set property "databaseSchemaUpdate

Error message

No flowable tables in DB. Set property "databaseSchemaUpdate" "true" or value="create-drop" (use create-drop for testing only!) for automatic schema creation

What it means

Thrown by Flowable's schema version check when the engine connects to a database in which none of the Flowable tables exist. The schema check ('create' or 'true' mode expected tables, queried the metadata, and the lookup failed with a missing-tables exception). Flowable deliberately refuses to run against an empty/uninitialized schema rather than failing later with cryptic SQL errors.

Source

Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/db/EngineSqlScriptBasedDbSchemaManager.java:66

        try {
            String dbVersion = getDbVersion();
            String currentVersion = getEngineVersion();
            if (!currentVersion.equals(dbVersion)) {
                throw new FlowableWrongDbException(currentVersion, dbVersion);
            }

            String errorMessage = null;
            if (!isEngineTablePresent()) {
                errorMessage = addMissingComponent(errorMessage, context);
            }

            if (errorMessage != null) {
                throw new FlowableException("Flowable database problem: " + errorMessage);
            }

        } catch (Exception e) {
            if (isMissingTablesException(e)) {
                throw new FlowableException(
                        "No flowable tables in DB. Set property \"databaseSchemaUpdate\" \"true\" or value=\"create-drop\" (use create-drop for testing only!) for automatic schema creation",
                        e);
            } else {
                if (e instanceof RuntimeException) {
                    throw (RuntimeException) e;
                } else {
                    throw new FlowableException("couldn't get " + context + " db schema version", e);
                }
            }
        }

        logger.debug("flowable {} db schema check successful", context);
    }

    @Override
    public void schemaCreate() {

        if (lockConfiguration.isUseLockForDatabaseSchemaUpdate()) {

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Set databaseSchemaUpdate="true" (auto-create/upgrade on boot) or "create-drop" (testing only) in your engine configuration or flowable.cfg.xml.
  2. Create the schema manually by executing the SQL scripts for your database from the Flowable distribution (org/flowable/db/create/).
  3. Verify the JDBC URL points to the database/schema where Flowable tables actually live.
  4. Check the DB user's permissions/default schema so it can see the Flowable tables.

Example fix

// before
ProcessEngineConfiguration cfg = ProcessEngineConfiguration
    .createProcessEngineConfigurationFromResource("flowable.cfg.xml"); // databaseSchemaUpdate=false
// after
cfg.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
Defensive patterns

Strategy: validation

Validate before calling

try (Connection c = ds.getConnection(); ResultSet rs = c.getMetaData().getTables(null, null, "ACT_GE_PROPERTY", new String[]{"TABLE"})) {
  if (!rs.next()) throw new IllegalStateException("Flowable tables missing; set databaseSchemaUpdate=true or run create scripts");
}

Try / catch

catch (FlowableException e) { if (e.getMessage().startsWith("No flowable tables")) { initSchema(); } else { throw e; } }

Prevention

When it happens

Trigger: Calling engine configuration init (e.g. ProcessEngineConfiguration.buildProcessEngine()) with databaseSchemaUpdate set to "false" (or unset) while the target database/schema has no ACT_* / FLW_* tables; pointing the JDBC URL at the wrong or empty schema/catalog; the DB user lacks rights to see the tables in another schema.

Common situations: Fresh environment where SQL scripts were never run; switching datasource to a new database; H2/in-memory DB recreated per test with schema update disabled; wrong default schema for Oracle/Postgres users; tables created in one schema but connection resolves to another.

Understand the failure class

Background: "X is required", "must be set", "cannot be empty": the missing-required-config error family, from Vertex AI project/location to WeChat keys — this error's family across 18 libraries.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/3763e4dea43a4e19. Report an issue: GitHub.