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

时间:2018-08-09 09:36:35

标签: oracle docker oracle12c flyway

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

有没有办法强制飞路清理Oracle数据库?

要回答评论中的问题:

这是在通过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;

创建的

1 个答案:

答案 0 :(得分:5)

如果当前架构被视为系统架构,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列表中或具有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网址以该用户身份连接到该PDB:

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