我已经下载了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;
答案 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