【问题标题】:flyway init oracle insufficient privilegesflyway init oracle权限不足
【发布时间】:2023-03-11 15:00:02
【问题描述】:

我正在从 Maven 构建中执行 Flyway。我有使用 Flyway 的经验,但几年没有使用 Oracle。当它尝试运行 init 目标时,我收到以下错误消息:

    [INFO] --- flyway-maven-plugin:3.0:clean (prepare-schema-using-flyway) @ my-project ---
    [INFO] Database: jdbc:oracle:thin:@my-oracle-host:1521:dev (Oracle 11.2)
    [INFO] Cleaned schema "MY_SCHEMA" (execution time 00:03.483s)
    [INFO]
    [INFO] --- flyway-maven-plugin:3.0:init (prepare-schema-using-flyway) @ my-project ---
    [INFO] Database: jdbc:oracle:thin:@my-oracle-host:1521:dev (Oracle 11.2)
    [INFO] Creating Metadata table: "MY_SCHEMA"."schema_version"
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 16.991s
    [INFO] Finished at: Thu Aug 21 09:44:09 CDT 2014
    [INFO] Final Memory: 20M/160M
    [INFO] ------------------------------------------------------------------------
    [ERROR] Failed to execute goal org.flywaydb:flyway-maven-plugin:3.0:init (prepare-schema-using-flyway) on project my-project: org.flywaydb.core.internal.dbsupport.FlywaySqlScriptException: Error executing statement at line 17: CREATE TABLE "MY_SCHEMA"."schema_version" (
    [ERROR] "version_rank" INT NOT NULL,
    [ERROR] "installed_rank" INT NOT NULL,
    [ERROR] "version" VARCHAR2(50) NOT NULL,
    [ERROR] "description" VARCHAR2(200) NOT NULL,
    [ERROR] "type" VARCHAR2(20) NOT NULL,
    [ERROR] "script" VARCHAR2(1000) NOT NULL,
    [ERROR] "checksum" INT,
    [ERROR] "installed_by" VARCHAR2(100) NOT NULL,
    [ERROR] "installed_on" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    [ERROR] "execution_time" INT NOT NULL,
    [ERROR] "success" NUMBER(1) NOT NULL
    [ERROR] ): ORA-01031: insufficient privileges
    [ERROR] -> [Help 1]
    [ERROR]
    [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
    [ERROR] Re-run Maven using the -X switch to enable full debug logging.

当我尝试通过 JDBC 连接(我使用 IntelliJ 的 DBHelper)执行相同的 SQL 时,我收到了相同的错误消息。当我删除所有双引号时,它成功执行了。

我无法想象 Flyway 3.0 与 Oracle 不兼容,但我怀疑可能有一个服务器设置指定了在创建期间围绕数据库对象的字符。例如,"my_table"."my_id" 或 [my_table].[my_id]

或者,有没有办法在 Flyway 的配置中关闭双引号?

【问题讨论】:

  • 双引号是有效的,但可能会影响你正在做的事情。 MY_SCHEMA的实际值是大写的;或者引用的值是混合的还是小写的?如果引用混合大小写标识符,则它们必须始终完全匹配;因此,您可能应该将脚本中自动引用的所有值都设为大写以避免将来的痛苦。
  • 双引号总是很可疑,但我想知道这里是否还有其他事情发生。如果架构名称错误,则错误应为ORA-01918: user 'MY_SCHEMA' does not existORA-01031: insufficient privileges 表示架构存在,但您无权修改它。您是否有多个具有不同大小写和不同权限的“MY_SCHEMA”用户?检查select * from dba_sys_privs where lower(grantee) = 'my_schema';
  • jdbc连接的用户必须有create any table的权限,如果和MY_SCHEMA不同的话。如果没有,您将收到您显示的错误。如果MY_SCHEMA是通过jdbc连接的同一个用户,那么你必须拥有CREATE TABLE的权限
  • @Tim Andersen,您能否在使用 SQL 工具运行此 create table 语句时显示其输出? sqlplus 之类的就可以了。

标签: oracle flyway


【解决方案1】:

我确实相信“引用”与问题无关,即使它真的很烦人,并且总是会导致在没有正确使用 lower 等函数的情况下咨询 Oracle 字典视图的问题。这里真正的关键是错误信息:ORA-01031: insufficient privileges

通常的意思是:

  • JDBC 连接的用户与MY_SCHEMA 不同。如果是这种情况,用户必须拥有权限CREATE ANY TABLE或具有该权限的角色(如DBA)。
  • JDBC 连接的用户是MY_SCHEMA。如果是这种情况,您的用户必须拥有特权CREATE TABLE,或包含此类系统特权的角色(如RESOURCE

根据flyway的GitHub项目,报告了一个非常相似的问题,并通过确保用户已被授予系统权限CREATE VIEW得到解决

确保 Oracle 数据库的字符集支持 Unicode。 此外,对于数据库的初始创建,Oracle 用户 必须具有 CREATE VIEW 系统权限。没有这个特权, 安装过程中可能会产生以下错误:Schema 创建失败:ORA-01031:权限不足。

我在您的日志消息中还看到,您在运行创建之前正在清理架构。如果此类操作意味着删除 MY_SCHEMA 用户,则应注意此类创建包含必要的系统权限。

如果权限可能是个问题,flyway 还建议在外部处理架构创建。

Flyway 最好让用户手动处理模式创建 由于权限,无法正确执行此操作。我想这是一个 便利性和安全性之间的权衡 - 应用权限 因为你可能有一天会需要它们,感觉不对。在这种情况下,您可以 应用您需要的 GRANT。

如果你有足够的权限访问数据库,我首先建议检查权限是否有问题是使用角色 DBA 的 Oracle 用户进行操作,因此你将能够验证它有效。

对于您的消息,我猜您是在开发环境中,所以这应该不是问题。

【讨论】:

    猜你喜欢
    • 2015-06-25
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多