Doctrine 2操作Oracle 19c插入数据报ORA-02289序列不存在求助
问题排查与解决方案
你当前的运行环境(方便对应版本定位问题)
- php 7.4
- 运行在虚拟机中的Symfony Version 5
- Ubuntu 20.4
- doctrine/orm 2.8.2
- doctrine/dbal 2.12.1
- Oracle 19c 数据库
排查步骤(按优先级从高到低尝试)
核对序列名拼接逻辑与Schema配置
报错的高频原因是Doctrine底层拼接序列名和实际存在的序列名不一致,你可以先开启Symfony的Doctrine SQL日志,查看执行插入时实际调用的序列查询SQL,确认拼接后的序列名是否为你预期的SCHEMA.SEQ_USERS。
同时检查config/packages/doctrine.yaml中是否配置了doctrine.dbal.default_schema参数,如果配置的默认Schema和序列所属的Schema不一致,也会导致拼接错误。如果确认Schema归属正确,可以尝试去掉注解中的Schema前缀,将序列名配置改为sequenceName="SEQ_USERS",同时将default_schema设为序列所属的Schema,避免拼接逻辑异常。核对数据库用户权限
你确认序列存在时使用的数据库用户,要和Symfony连接Oracle的用户完全一致。Oracle中如果当前连接用户没有对应序列的SELECT权限,也会抛出ORA-02289错误,你可以直接用Symfony配置的数据库账号执行以下SQL测试:
SELECT SCHEMA.SEQ_USERS.NEXTVAL FROM DUAL;
如果执行该SQL也报错,说明要么序列名/归属Schema写错,要么当前用户缺少权限,需要给当前连接用户授予该序列的SELECT权限。
- 核对Oracle对象名大小写
Oracle默认会将不加双引号的对象名转为大写存储,如果你创建序列时使用了双引号强制指定了小写(比如CREATE SEQUENCE "schema"."seq_users"),那么注解中写的SCHEMA.SEQ_USERS就会因为大小写不匹配找不到对象。需要保证注解中的序列名、Schema名和创建时的大小写完全一致,如果创建时用了小写双引号,注解中也要对应写成小写。
你也可以尝试强制指定序列名的双引号,避免Doctrine自动转义:
@ORM\SequenceGenerator(sequenceName="\"SCHEMA\".\"SEQ_USERS\"", initialValue=1, allocationSize=100)
- 适配低版本DBAL的Oracle驱动bug
你使用的doctrine/dbal 2.12.1版本较老,部分老版本的Oracle驱动对带Schema的序列名处理存在已知逻辑bug,如果以上步骤都无效,可以尝试升级dbal到2.12.x的最新小版本,或者ORM到2.8.x的最新小版本,修复已知的序列处理问题。
内容的提问来源于stack exchange,提问作者Michael Schrading
相关产品推荐
相关产品推荐

