ORA-01031错误源于当前用户缺少对目标序列的SELECT权限,需由序列属主显式授予GRANT SELECT ON seq_name TO user,且PL/SQL中需注意DEFINER'S/INVOKER'S RIGHTS权限模型差异。
这个错误不是序列本身没创建,而是当前用户缺少对目标序列的SELECT权限。Oracle里访问序列必须显式授予SELECT权,角色(如RESOURCE)里的权限在运行时默认不生效——哪怕你有CREATE SEQUENCE权限,也不等于能用别人建的序列。
先定位具体对象:错误堆栈或SQL语句里出现的序列名(比如hr.emp_seq),就是你要查的目标。别猜,直接看报错上下文里的完整对象名。
SELECT * FROM DBA_TAB_PRIVS WHERE TABLE_NAME = 'EMP_SEQ' AND GRANTEE = 'YOUR_USER';,查是否已有授权SELECT SEQUENCE_OWNER, SEQUENCE_NAME FROM DBA_SEQUENCES WHERE SEQUENCE_NAME = 'EMP_SEQ';
"emp_seq"),权限也得按原大小写授必须由序列属主(如hr)或具备GRANT ANY OBJECT PRIVILEGE的用户执行,不能靠DBA角色代劳。
sqlplus hr/hr_password
GRANT SELECT ON emp_seq TO your_user;
your_user,运行SELECT hr.emp_seq.NEXTVAL FROM DUAL;(必须带schema前缀)切记:不要用GRANT SELECT ANY SEQUENCE——这是高危系统权限,只该给运维账号。
如果是在存储过程、函数里调用序列报ORA-01031,问题常出在权限继承模型上:
DEFINER'S RIGHTS,即按过程所有者权限执行——此时your_user只需有EXECUTE权,但过程所有者必须对序列有SELECT权INVOKER'S RIGHTS,则按调用者权限执行,your_user自己必须被直接授予SELECT ON hr.emp_seq
SELECT AUTHID FROM DBA_PROCEDURES WHERE OBJECT_NAME = 'YOUR_PROC';
最隐蔽的坑是:开发在SQL*Plus里用SET ROLE ALL后测试成功,但应用连上来没启用角色,序列权限就失效——别依赖角色,直接授。