Oracle中SQL可查v$session,触发器查询却报ORA-00942错误
问题原因分析
触发器的权限上下文差异
直接执行select * from v$session时,当前会话可通过角色权限(比如DBA角色)结合公共同义词访问视图,但触发器默认采用定义者权限,编译和执行时只会使用创建者的直接授予权限,不会继承角色权限。如果当前用户仅通过角色拥有v$系列视图的访问权,触发器就会因权限不足找不到对象。动态性能视图的权限要求
v$session、v$transaction本质是SYS用户下的v_$session、v_$transaction视图,公共同义词只是指向这些对象。只有当用户被直接授予SELECT ON SYS.V_$SESSION和SELECT ON SYS.V_$TRANSACTION权限时,定义者权限的触发器才能正常访问它们;仅通过角色获得的权限无法被触发器继承。SQL Developer的显示逻辑问题
SQL Developer在公共同义词节点显示v$session,且执行查询能返回数据,是因为当前会话启用了角色权限;但编辑器的语法校验和触发器编译过程,是基于用户的直接权限进行检查的,所以会出现标红提示和编译报错的情况。
解决方向
- 由SYS用户直接为当前用户授予对应权限:
GRANT SELECT ON SYS.V_$SESSION TO 你的用户名; GRANT SELECT ON SYS.V_$TRANSACTION TO 你的用户名; - 若业务允许,可将触发器设置为调用者权限(需确保调用者有对应权限):
CREATE OR REPLACE TRIGGER TRG_SLIP_DEL AUTHID CURRENT_USER -- 触发器其他逻辑
内容的提问来源于stack exchange,提问作者user1169587
相关产品推荐
相关产品推荐

