一、场景说明:

同事将视图(A用户)的读取权限授予C用户后,

登录C用户后,读取该视图报错ORA-01031: 权限不足

二、遇到该问题时,我的处理思路:

1、首先该报错一般是创建视图会报,因为缺少CREATE VIEW权限,但读取视图报这个错误却属于非正常情况

2、忽略原理,首先尝试解决问题,询问该视图是否问跨用户视图,得到确认

3、询问是否所有视图相关基表的读取权限都赋予了C用户,得到肯定答复

并且得到反馈为,基表赋权后,直接通过视图的创建语句(select)进行读取可以获得结果,但直接读取视图依然报ORA-01031

4、当时无现成方案,决定赋予C用户select any table系统权限临时处理

三、问题诊断思路:

1、这种问题算诡异问题的一种。因为理论上,赋予视图读取权限要么成功后可以正常读取,要么因为权限不足报错ORA-00990: 权限缺失或无效。

如果报00990 一般为缺少其他用户相关基表的 with grant option,重新赋予读取权限并增加 with grant option解决即可。

2、询问同事是否使用A用户进行授权的,得到使用SYS用户进行直接授权的。怀疑与直接用SYS用户授权有关

四、问题场景模拟还原:

思路说明:创建A,B,C用户。A用户创建视图V_a,并包含B用户的dept表。通过sys用户将该视图的select权限赋予C用户。

1、创建用户

SQL> create user a identified by a account unlock;

用户已创建。

SQL> create user b identified by b account unlock;

用户已创建。

SQL> create user c identified by c account unlock;

用户已创建。

SQL> grant connect,resource to a,b,c;

授权成功。

2、创建表及相关视图

B用户

SQL> create table a.emp as select * from scott.emp;

表已创建。

SQL> create table b.dept as select * from scott.dept;

表已创建。

SQL> create view a.v_a as select a.* from a.emp a ,b.dept b where a.deptno=b.deptno;

create view a.v_a as select a.* from a.emp a ,b.dept b where a.deptno=b.deptno

*

第 1 行出现错误:

ORA-01031: 权限不足

SQL> grant select on b.dept to a;

授权成功。

SQL> create view a.v_a as select a.* from a.emp a ,b.dept b where a.deptno=b.deptno;

视图已创建。

3、错误重现

首先我们通过A用户直接授权,看会出现什么情况

SQL> conn a/a

已连接。

SQL> grant select on v_a to c;

grant select on v_a to c

*

第 1 行出现错误:

ORA-01720: 不存在 'B.DEPT' 的授权选项

这里明确提醒,a用户只有dept的select权限,但没有将该表的select权限赋予别人的能力

现在通过sys用户授权看看,看是否可以成功?。

SQL> conn / as sysdba

已连接。

SQL> grant select on a.v_a to c;

授权成功。

这里显示授权成功了,我们读取看看

SQL> conn c/c

已连接。

SQL> select * from a.v_a

2 ;

select * from a.v_a

*

第 1 行出现错误:

ORA-01031: 权限不足

错误重现。

五、解决方案

SQL> conn / as sysdba

已连接。

SQL> grant select on b.dept to a with grant option;

授权成功。

SQL> conn c/c

已连接。

SQL> select count(*) from a.v_a;

COUNT(*)

----------

14

问题处理完毕,但这不算结束。

因为这里是模拟环境,很容易就找到夸用户表,如果生产环境出现跨越多个用户,多个表,难道一个一个找?现在寻找脚本解决它。

编写脚本如下:

select 'grant select on '||referenced_owner||'.'||REFERENCED_NAME||' to '||owner||'with grant option;' from DBA_DEPENDENCIES where owner=upper('&viewowner') and name=upper('&viewname') and type='VIEW' and referenced_type='TABLE';

将该语句获得的结果通过dba用户执行即可。

涉及到两个变量

变量1、viewowner输入视图的拥有者

变量2、viewname 输入视图名称

六、整体演示(连脚本功能)

1、初始化环境

SQL> drop user a cascade;

用户已删除。

SQL> drop user b cascade;

用户已删除。

SQL> drop user c cascade;

用户已删除。

SQL> create user a identified by a account unlock;

用户已创建。

SQL> create user b identified by b account unlock;

用户已创建。

SQL> create user c identified by c account unlock;

用户已创建。

SQL>

SQL> grant connect,resource to a,b,c;

授权成功。

SQL> create table a.emp as select * from scott.emp;

表已创建。

SQL> create table b.dept as select * from scott.dept;

表已创建。

SQL> grant select on b.dept to a;

授权成功。

SQL> create view a.v_a as select a.* from a.emp a ,b.dept b where a.deptno=b.deptno;

视图已创建。

SQL> grant select on a.v_a to c;

授权成功。

SQL> conn c/c

已连接。

SQL> select count(*) from a.v_a;

select count(*) from a.v_a

*

第 1 行出现错误:

ORA-01031: 权限不足

通过脚本处理该问题

SQL> conn / as sysdba

已连接。

SQL> select 'grant select on '||referenced_owner||'.'||REFERENCED_NAME||' to &&viewowner with grant option;' from DBA_DE

PENDENCIES where name=upper('&viewname') and owner=upper('&&viewowner') and type='VIEW' and referenced_type='TABLE';

输入 viewowner 的值: a

输入 viewname 的值: v_a

原值 1: select 'grant select on '||referenced_owner||'.'||REFERENCED_NAME||' to &&viewowner with grant option;' from

DBA_DEPENDENCIES where name=upper('&viewname') and owner=upper('&&viewowner') and type='VIEW' and referenced_type='TABLE

'

新值 1: select 'grant select on '||referenced_owner||'.'||REFERENCED_NAME||' to a with grant option;' from DBA_DEPEND

ENCIES where name=upper('v_a') and owner=upper('a') and type='VIEW' and referenced_type='TABLE'

'GRANTSELECTON'||REFERENCED_OWNER||'.'||REFERENCED_NAME||'TOAWITHGRANTOPTION;'

--------------------------------------------------------------------------------

grant select on A.EMP to a with grant option;

grant select on B.DEPT to a with grant option;

SQL> grant select on A.EMP to a with grant option;

授权成功。

SQL> grant select on B.DEPT to a with grant option;

授权成功。

检查结果

SQL> conn c/c

已连接。

SQL> select count(*) from a.v_a;

COUNT(*)

----------

14

This case end;

Thank for watching;

====================================================

勤学如春起之苗,不见其增日有所长。辍学如磨刀之石,不见其损日有所亏

Email: orahank.dai@gmail.com QQ: 88285879

oracle杀进程报错01031,select视图报错ORA-01031(oracle跨用户基表视图授权)相关推荐

  1. oracle 杀进程

    1.查看锁表进程 --1.查看锁表进程SQL语句 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.obje ...

  2. oracle数据库看开销,【Database】AIX系统下跟踪开销大的Oracle数据库进程

    Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE本文介绍AIX系统下跟踪开销大的Oracle数据库进程的具体运行语句等信息的方法. 方法一 ...

  3. oracle死锁进程杀不掉,oracle杀死死锁进程

    先查看哪些表被锁住了 selectb.owner,b.object_name,a.session_id,a.locked_mode fromv$locked_objecta,dba_objectsb ...

  4. 不同scheam下查询视图报错ORA-01031的故障解决

    客户在schema MEDADM下创建了一个视图,并且将视图的查询权限赋予给了另一个用户BAZK. 但是使用BAZK查询视图的时候还是报错: ORA-01031: insufficient privi ...

  5. linux系统报错01031,从ORA-01031报错看密码文件故障

    3.问题分析二 从思路上,应该是没有问题.而且在无故障环境下,我们通过实验是可以验证结论的.首先一种思路是判断是不是密码文件被正确的使用. SQL> conn / as sysdba Conne ...

  6. 杀掉某个进程!怎么查看pid,报错:Address already in use

    说在文前,菜鸟一个,如果有说的不对的,还请见谅,望能指出,让我这井底之蛙也能见见世面. 今天分享下一个比较常见的问题,端口被占用. 报错大致类型如下: 这里我是zookeeper开启的时候,报了Add ...

  7. Oracle 数据库设置最大进程数参数方法,oracle最大进程数满了处理方法,sysdba管理员登录报“maximum number of processes (150) exceeded“问题解决

    oracle 数据库使用 sysdba 管理员登录报: ORA-00020: maximum number of processes (150) exceeded 译:超过了最大进程数(150) 方法 ...

  8. myelclipse Servers视图报错

    有时候我们强制关闭eclipse的时候会导致我们的Servers视图报错 这个问题其实就是我们的myeclipse的工作空间出啦问题.删除工作空间的一个配置文件重新进行配置就可以解决 找到你的myec ...

  9. 解决64位进程调用32位库文件报错问题

    解决64位进程调用32位库文件报错问题 解决64位进程调用32位库文件报错问题 大家集成的apk如果使用了第三方32位lib库文件的话请按如下方法修改Android.mk文件:库文件的拷贝方式为: L ...

最新文章

  1. vue java 插件开发_实习模块vue+java小型全栈开发(三)
  2. 线程本地ThreadLocal的介绍与使用!
  3. Linux命令:grep命令详解
  4. jav中什么是组织java程序_Java程序的执行过程中用到一套JDK工具,其中javaprof.exe是指()。A.Java调试器B.Java剖析工具C.Jav...
  5. python3 字典合并_python3字典合并怎么做?
  6. 【转】PP模块快速入门之功能简介
  7. Atitti cto的日常流程与职责attilax总结
  8. 06【五险一金解读】还有你的工资条哦?
  9. 图解电动汽车:电动汽车工作原理
  10. 3Ds Max 精简材质编辑器 一片黑问题
  11. c语言码流文件,视频文件大小的计算以及视频在网络上的传输(KB、kb、GB、kbps码率)...
  12. YII2.0电商平台开发笔记
  13. python中怎么赋值一个数为负无穷_python里面正无穷和负无穷问题?
  14. r语言ggplot2一夜多图_关于GGPLOT2出图里的一页多图模式
  15. 超低功耗 段码LCD液晶显示驱动IC-VKL060 SSOP24 15SEG*4COM,超低工作电流约7.5微安,多用于传感器/水电表/工控仪表等
  16. Java HashMap 深入学习!HashMap 怎么 hash?又如何 map?
  17. 机器人履带底盘的悬挂和传动
  18. 放大图片并保持清晰度的方法!
  19. 在LINUX中怎样用FIDISK分区,fdisk分区命令详解与fdisk非交互式分区
  20. 猴子摘桃:猴子摘了x个桃,每天吃一半,最多吃一个,第7天吃的时候剩下一个了,猴子摘了多少桃子?(代码+分析)

热门文章

  1. task02 fashion-mnist分类实战
  2. 从论坛夜色版块的繁华看SNS
  3. KMP代码《C++版》
  4. 【jQuery】ance desc选择器
  5. 【 Apollo 】dreamview 无法启动
  6. buildroot 遇到的CWD 问题
  7. excel和matlab 差别,求助: 用matlab和excel做的回归分析的结果为什麽不一样?
  8. 智慧工地:隧道人员定位系统
  9. ts 打开sourcemap_调试篇 – Source Map - Node.js 调试指南
  10. 如何搭建高质量的 B 端产品帮助体系?