提问者:小点点

在Spring应用程序中,防止H2将标识符大小写转换为大小写


我正在使用Spring 2.6.2并且两者都尝试过:

testImplementation("com.h2database:h2:2.1.214")

testImplementation("com.h2database:h2:1.4.200")

我在应用程序启动期间使用JDBC连接到数据库的原始SQL创建数据库模式。

CREATE SCHEMA IF NOT EXISTS "001"
CREATE SCHEMA IF NOT EXISTS "002schema"
CREATE SCHEMA IF NOT EXISTS "3_schema"

然后Liquibase执行数据库迁移。

当针对PostgreSQL运行时,这可以正常工作,并且使用提供的文字字符串创建模式。这些模式中的表也都是小写的,如Liquibase变更日志中指定的那样。

当在单元测试中针对H2运行时,在为002schema执行数据库迁移时会引发异常。看起来Liquibase期望所有模式都处于大小写状态,从而导致失败。

应用程序启动期间的异常:

Initializing Liquibase for schema 001
Creating database history table with name: "001".DATABASECHANGELOG
Liquibase ran for schema 001
..
Initializing Liquibase for schema 002schema
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibaseMultiTenant' defined in class path resource [com/company/app/data/liquibase/LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.LockException: liquibase.exception.DatabaseException: Schema "002SCHEMA" not found; SQL statement:
CREATE TABLE "002SCHEMA".DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID)) [90079-214] [Failed SQL: (90079) CREATE TABLE "002SCHEMA".DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID))]

我在H2URL中尝试了以下选项,以防止一切都是大写的,但都不起作用。

有什么想法吗?

spring:
  datasource:
    platform: h2
    url: jdbc:h2:mem:test;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false;DATABASE_TO_UPPER=false;
    driver-class-name: org.h2.Driver
    username: sa
    password:

也试过:

spring:
  datasource:
    platform: h2
    url: jdbc:h2:mem:test;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false;DATABASE_TO_LOWER=true;CASE_INSENSITIVE_IDENTIFIERS=true;
    driver-class-name: org.h2.Driver
    username: sa
    password:

共1个答案

匿名用户

如果模式的名称是双引号,如“002SCHOMA”或“002schema”,则它区分大小写,否则不区分引号:

PostgreSQL列名是否区分大小写?

也许你可以通过改变这个来解决这个问题:

CREATE SCHEMA IF NOT EXISTS "002schema"

对此:

CREATE SCHEMA IF NOT EXISTS "002SCHEMA"

或者以某种方式使liquibase不在模式名称上使用引号