使用OWNER和USER的Oracle设置无法使用一个SCHEMA_VERSION表

时间:2015-11-05 18:38:17

标签: java oracle flyway

我们正在评估flyway以设置一个Oracle数据库,该数据库具有所有表所在的OWNER模式,以及一个USER,它以同义词的形式被授予对OWNER表的访问权限。有时USER也需要编写自己的表。我们还希望将升级sql脚本保存在一个子目录中,而不是每个都有一个单独的目录用于OWNER和USER。

所以,OWNER有以下配置:

flyway.url=jdbc:oracle:thin:@localhost:1521
flyway.user=OWNER
flyway.schemas=OWNER
flyway.password=OWNER

和USER,相应地

flyway.url=jdbc:oracle:thin:@localhost:1521
flyway.user=USER
flyway.schemas=OWNER, USER
flyway.password=USER

我希望flyway将访问OWNER模式中的SCHEMA_VERSION表,因为它是模式列表中的第一个。

整个事情在流浪汉中运行,当我说vagrant up时,我收到错误消息。相关摘录是:

==> vagrantbox: Successfully applied 1 migration to schema "OWNER" (execution time 00:00.388s).
==> vagrantbox: flyway -configFile=config/USER.conf -target=1.99999 migrate
==> vagrantbox: Flyway 3.2.1 by Boxfuse
==> vagrantbox: Database: jdbc:oracle:thin:@localhost:1521 (Oracle 11.2)
==> vagrantbox: Validated 4 migrations (execution time 00:00.119s)
==> vagrantbox: Creating Metadata table: "OWNER"."schema_version"
==> vagrantbox: ERROR:
==> vagrantbox: Script failed
==> vagrantbox: -------------
==> vagrantbox: SQL State  : 42000
==> vagrantbox: Error Code : 1031
==> vagrantbox: Message    : ORA-01031: insufficient privileges
==> vagrantbox: Line       : 17
==> vagrantbox: Statement  : CREATE TABLE "OWNER"."schema_version" (
看起来像flyway的

能够确定USER的schema_version表应该在OWNER模式中,但是没有看到它已经在那里。

在flyway来源中,我看到这个检查是在MetadataTableImpl中完成的,如下所示:

private void createIfNotExists() {
    if (table.exists()) {
        return;
    }

反过来,Oracle会调用连接的元数据:

        resultSet = jdbcTemplate.getMetaData().getTables(
                catalog == null ? null : catalog.getName(),
                schema == null ? null : schema.getName(),
                table,
                types);
        found = resultSet.next();

这是否适用于库存Oracle XE版本11.2.0 JDBC驱动程序?将SQL Developer中的xdb6.jar和xmlparserv2.jar添加到类路径后,以下groovy代码段

def results = conn.getMetaData().getTables(null, "OWNER", "schema_version")
println results.next() as boolean

另有说法:

$ groovy TestMetaData.groovy
false

这可以解释飞路似乎认为桌子不在那里,但现在我完全被难倒了。这里发生了什么?当然,对getMetaData()。getTables()的调用一般都能正常工作吗?或者这是瘦司机不能做的事情?

0 个答案:

没有答案