如何强制 flyway 清理我的 docker oracle 数据库?

How can I force flyway to clean my docker oracle database?

我已经下载了 Oracle 数据库 EE 的官方 oracle docker 映像。我有一个 flyway 配置,并且经常 运行 flyway:clean 针对本地安装的数据库 XE 版本。然而 flyway 告诉我不允许清理 docker 图像中的数据库,但它可以迁移它。

有没有办法强制 flyway 清理 oracle 数据库?

回答评论中的问题:

这是 运行ning flyway 通过 maven 时的错误消息:

org.flywaydb.core.api.FlywayException: Clean not supported on Oracle for system schema "SCHEMA_OWNER"! It must not be changed in any way except by running an Oracle-supplied script! -> [Help 1]

我联系的用户是用 alter session set "_ORACLE_SCRIPT"=true;

创建的

如果当前架构被视为系统架构,Flyway 将 throw this exception

@Override
protected void doClean() throws SQLException {
    if (isSystem()) {
        throw new FlywayException("Clean not supported on Oracle for system schema " + database.quote(name) + "! " +
                "It must not be changed in any way except by running an Oracle-supplied script!");
    }

如果模式在 known default schemas or has ORACLE_MAINTAINED = 'Y' 列表中,则该模式被视为系统模式。

使用 alter session set "_ORACLE_SCRIPT"=true; 创建用户会为用户/架构设置 ORACLE_MAINTAINED = 'Y'

Oracle 12c 中有两种数据库:容器数据库 (CDB) 和可插拔数据库 (PDB)。这是为了支持Multitenancy.

您当前正在 CDB 中创建用户,这将是所有 PDB 中的公共用户。在这种情况下,您必须在用户名前加上 c##:

create user c##scott identified by tiger;

或者使用alter session set "_ORACLE_SCRIPT"=true;,否则会报错:

ORA-65096: invalid common user or role name in oracle

另一种方法是连接到 PDB 并在那里创建一个本地用户(不需要前缀,用户将只存在于该 PDB 中),例如:

sqlplus sys/Oradoc_db1@ORCLPDB1 as sysdba

create user scott identified by tiger;

更新 Flyway url 以作为该用户连接到该 PDB:

-url=jdbc:oracle:thin:@oracle-ee:1521/orclpdb1.localdomain -user="scott" -password=tiger