Oracle 10g创建触发器提示序列不存在但单独查询正常如何解决
触发该问题的核心原因是Oracle的定义者权限模型限制:触发器默认使用定义者权限执行,执行过程中会禁用所有通过角色授予的权限,仅保留直接授予用户的权限。你当前能手动查询序列值,说明你通过角色拥有该序列的访问权限,但该权限在触发器执行上下文不生效,此外也可能是序列归属、大小写匹配问题导致触发器无法识别序列。
解决方案
方案1:给触发器创建用户直接授予序列的SELECT权限
如果序列不属于当前创建触发器的用户,使用序列所有者账号执行以下授权命令:GRANT SELECT ON <序列所有者用户名>.ALL_BANK_STMT_SEQ TO <触发器创建用户名>;方案2:触发器中显式指定序列的完整归属名
修改触发器代码,给序列加上所属用户前缀,避免Oracle默认匹配当前用户对象找不到的问题:
CREATE OR REPLACE TRIGGER ALL_BANK_STMT_TRG BEFORE INSERT ON ALL_BANK_STMT FOR EACH ROW BEGIN SELECT <序列所有者用户名>.ALL_BANK_STMT_SEQ.NEXTVAL INTO :NEW.BANK_STMT_LN_NO FROM SYS.DUAL; END; /
如果序列就是当前创建触发器的用户所有,可以直接写为:SELECT CURRENT_USER.ALL_BANK_STMT_SEQ.NEXTVAL INTO :NEW.BANK_STMT_LN_NO FROM SYS.DUAL;
方案3:配置公共同义词简化引用
如果需要多个用户访问该序列,可以创建公共同义词,无需每次指定所有者前缀:CREATE PUBLIC SYNONYM ALL_BANK_STMT_SEQ FOR <序列所有者用户名>.ALL_BANK_STMT_SEQ;补充排查点
如果创建序列时使用了双引号指定大小写(如CREATE SEQUENCE "all_bank_stmt_seq"),引用时必须严格匹配大小写并加双引号,否则也会触发ORA-02289错误。
内容的提问来源于stack exchange,提问作者Samik Mukherjee

