首页 > 其他分享 >ORA-01031: insufficient privileges 19c跨用户视图查询 with grant option

ORA-01031: insufficient privileges 19c跨用户视图查询 with grant option

时间:2023-09-01 23:33:49浏览次数:35  
标签:test1 test3 test2 option grant 视图 SQL select

问题概述

某客户从11.2.0.1 升级迁移到19.16 版本后,应用反应部分查询功能无法使用报无权限,数据库中增加了ORA-01031: insufficient privileges 跟踪event进行分析

问题复现

创建三个测试用户

create user test1 identified by oracle123;
create user test2 identified by oracle123;
create user test3 identified by oracle123;

分别给最小权限

grant connect to test1;
grant connect to test2;
grant connect to test3;
grant create view to test1;
grant create view to test2;
grant create view to test3;
grant create table to test1;
grant create table to test2;
grant create table to test3;
alter user test1 quota unlimited on users;
alter user test2 quota unlimited on users;
alter user test3 quota unlimited on users;

首先使用test3 登录数据库创建test3 表

sqlplus  test3/[email protected]:1521/pdb 
SQL> create table test3 (id number,name varchar(10));
Table created.
SQL> insert into test3 values(1,'wsb');
1 row created.
SQL> commit;

使用test2登录数据库创建v_test2 视图该视图依赖test3用户下面的表,需要给test2用户查询该表权限。

sqlplus  test2/[email protected]:1521/pdb  
create view v_test2 as select * from test3.test3;

给test2 授权

SQL> grant select on test3.test3 to test2;
Grant succeeded.
SQL> create view v_test2 as select * from test3.test3;
View created.
SQL> select  * from v_test2;

        ID NAME
---------- --------------------
         1 wsb

使用test1用户登录数据库进行测试

sqlplus  test1/[email protected]:1521/pdb   

SQL*Plus: Release 19.0.0.0.0 - Production on Wed May 17 10:30:49 2023
Version 19.16.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.16.0.0.0

SQL> select  * from test2.v_test2;
select  * from test2.v_test2
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

由于还没给视图权限所以无法进行查询

使用dba用户给权限test1

SQL> grant select on test2.v_test2  to test1;

Grant succeeded.

SQL>

再次使用test1 用户进行查询

SQL> select  * from test2.v_test2;
select  * from test2.v_test2
                     *
ERROR at line 1:
ORA-01031: insufficient privileges

依然报错
把test3.test3表的查询权限给到test1用户

SQL> grant select on test3.test3 to  test1;

Grant succeeded.

再次查询依然报错

SQL> select  * from test2.v_test2;
select  * from test2.v_test2
                     *
ERROR at line 1:
ORA-01031: insufficient privileges

SQL> select * from test3.test3;

        ID NAME
---------- --------------------
         1 wsb

直接查询表正常

解决方案

由于test2.v_test2 视图是依赖于test3.test3 表所以test2用户针对该表需要有with grant option 权限 赋予该权限后正常

SQL> grant select on test3.test3 to test2 with grant option;
Grant succeeded.
其实不需要单独授权test3.test3 给test1 用户
revoke select on test3.test3 from test1;
最终test2的权限如下
GRANTEE                        OWNER                          TABLE_NAME                     PRIVILEGE                                                                        GRANTA
------------------------------ ------------------------------ ------------------------------ -------------------------------------------------------------------------------- ------
TEST2                          TEST3                          TEST3                          SELECT                                                                           YES
TEST1                          TEST2                          V_TEST2                        SELECT                                                                           NO

参考文档

To grant SELECT on a view to another user, either you must own all of the objects underlying the view or you must have been granted the SELECT object privilege WITH GRANT OPTION on all of those underlying objects. This is true even if the grantee already has SELECT privileges on those underlying objects.


标签:test1,test3,test2,option,grant,视图,SQL,select
From: https://blog.51cto.com/u_13482808/7327063

相关文章

  • go-optioner:轻松生成函数选项模式代码
    [Go开源工具]go-optioner:轻松生成函数选项模式代码原创 陈明勇 Go技术干货 2023-07-2508:02 发表于广东收录于合集#Go开源1个大家好,我是 陈明勇,一个热爱技术,喜欢专研技术的程序员。Go技术干货专注于分享Go技术干货知识(基础、进阶、原理等)。50篇原创......
  • netty系列之ChannelOption
    netty系列之ChannelOption 1、概述在netty启动的时候会设置相关的ChannelOption,无论是在ServerBootstrap还是在Bootstrap,接下来解释一下常用的ChannelOption2、常用ChannelOptionChannelOption.SO_BACKLOG(一般用于option–>boss)BACKLOG用于构造服务端套接字ServerSocket......
  • Kernel panic - not syncing: No init found. Try passing init= option to kernel
    原文:https://blog.csdn.net/charliewangg12/article/details/42030235kernelpanic-notsyncing:Noinitfound. Trypassinginit=optiontokernel.这类问题很常见,先总体介绍一下解决思路。能出现让人激动的的控制台,那么系统移植已经接近完成;但是不少人在最后一步出现......
  • DWR util.js 整理(DWR 处理各种form表单Select/option,table等,
    /********************/util.js包含一些有用的函数function,用于在客户端页面调用.主要功能如下:代码$()获得页面参数值addOptionsandremoveAllOptions初始化下拉框addRowsandremoveAllRows填充表格getText取得text属性值getValue取得form表......
  • Netty 的 ChannelOption.SO_BACKLOG 知识点整理
    Netty的ChannelOption.SO_BACKLOG知识点整理 一个基于Netty的应用,在压力测试时,Socket请求数量一多,就发送失败,监测JVM内存大小比较稳定,猜测可能是ChannelOption.SO_BACKLOG这个配置导致的,设置的值是128。调整为1024后,连接失败的次数确实减少了一些,那么这个配置到......
  • Cognex InSight 电子表格视图功能介绍
    1.界面预览:这里我们将整体界面大致分为7个大的部分,当然布局可以按照自己的习惯自由拖放,这里只展示默认视图。各部分的功能说明:①菜单栏:这里对关键几个功能做介绍,没有提到都不是很重要 查看:当界面上的某一部分没有显示时,可以通过查看菜单重新打开。 传感器: 帮助–InS......
  • sql server创建视图操作
    1、什么是视图视图就是一个虚拟的数据表,该数据表中的数据记录是有一条查询语句的查询结果得到的。2、创建视图准则创建视图需要考虑一下准则:  #视图名称必须遵循标识符的规则,该名称不得与该架构的如何表的名称相同  #你可以对其他......
  • oralce 使用物化视图实例
    --创建物化视图30分钟刷新一次CREATEMATERIALIZEDVIEWtblcheckitemview_mvREFRESHCOMPLETESTARTWITHSYSTIMESTAMPNEXTSYSTIMESTAMP+INTERVAL'30'MINUTEASSELECT*FROMtblcheckitemview;--启用物化视图自动刷新BEGINDBMS_MVIEW.REFRESH('tblcheckitemview_mv'......
  • Optional
    Optional是Java8中引入的一个类,用于处理可能为null的值。它提供了一种优雅的方式来处理可能存在或不存在的值,并避免了空指针异常。Optional并不是用于替代所有的null检查,而是用来处理特定场景下可能为空的值的情况。Optional可以视为一个容器,它可以包含一个非空的值(存在),也可以为空......
  • 20230619 java.util.Optional
    介绍java.util.Optional类声明@jdk.internal.ValueBasedpublicfinalclassOptional<T>包装一个可能为null的值只有在正确使用的情况下才会更安全对应基本类型类:OptionalInt,OptionalLong,OptionalDoubleAPIstatic创建OptionalemptyofofNullablepublic......