Create view failed with ORA-01031:insufficient privileges

有时候在ORACLE数据库创建视图时会遇到:ORA-01031:insufficient privileges错误,我也多次碰到了各种创建视图出错的情况,很多时候也没有太在意,今天被一同事问起这个问题,顺便总结一下出错的各种场景。


场景1:使用sys或system账号登陆数据库,创建dm、ods账号(授予connect、resource角色)

   1: [oracle@DB-Server ~]$ sqlplus / as sysdba
   2:  
   3: SQL*Plus: Release 10.2.0.4.0 - Production on Fri Mar 14 10:28:49 2014
   4:  
   5: Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
   6:  
   7:  
   8: Connected to:
   9: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
  10: With the Partitioning, OLAP, Data Mining and Real Application Testing options
  11:  
  12:  
  13:  
  14: SQL> create user dm identified by dm default tablespace tbs_dm_data;
  15:  
  16: User created.
  17:  
  18:  
  19:  
  20: SQL> grant connect, resource to dm;
  21:  
  22: Grant succeeded.
  23:  
  24:  
  25:  
  26: SQL> create user ods identified by ods default tablespace tbs_ods_data;
  27:  
  28: User created.
  29:  
  30: SQL> grant connect ,resource to ods;
  31:  
  32: Grant succeeded.


在另外一个窗口,以dm账号登录数据库

   1: [oracle@DB-Server bdump]$ sqlplus /nolog
   2:  
   3: SQL*Plus: Release 10.2.0.4.0 - Production on Fri Mar 14 10:35:30 2014
   4:  
   5: Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
   6:  
   7: SQL> conn dm
   8: Enter password: 
   9: Connected.

创建测试表test,并插入数据。然后创建该表对应的视图v_dm_test时报ORA-01031: insufficient privileges

   1: SQL> create table dm.test
   2:   2  (
   3:   3     name  varchar2(12)
   4:   4  );
   5:  
   6: Table created.
   7:  
   8: SQL> insert into dm.test
   9:   2  select 'kerry' from dual;
  10:  
  11: 0 rows created.
  12:  
  13: SQL> commit;
  14:  
  15: SQL> create or replace view v_dm_test
  16:   2  as 
  17:   3  select * from dm.test;
  18: create or replace view v_dm_test
  19:                        *
  20: ERROR at line 1:
  21: ORA-01031: insufficient privileges
  22:  
  23:  
  24: SQL>

结论:在这个场景出现这个错误,是因为账号dm并没有授予创建视图的权限。需要授予dm账号创建视图的权限。以sys/system等具有DBA权限的账号登陆数据库,授予dm账号创建视图的权限。

   1: sys 账号:
   2:  
   3: SQL> show user;
   4: USER is "SYS"
   5: SQL> grant create view to dm;
   6:  
   7: Grant succeeded. 
   8:  
   9: dm 账号:
  10:  
  11: SQL> show user
  12: USER is "DM"
  13: SQL> create or replace view v_dm_test
  14:   2  as 
  15:   3  select * from dm.test;
  16:  
  17: View created.

场景2:在上面的场景中,在ods账号下创建test_ods表并插入数据。然后授权select给dm用户,然后在dm用户下创建视图

   1: ods login database
   2:  
   3: SQL> show user
   4: USER is "ODS"
   5: SQL> create table ods.test_ods
   6:   2  (
   7:   3     name  varchar2(12)
   8:   4  );
   9:  
  10: Table created.
  11:  
  12: SQL> insert into ods.test_ods
  13:   2  select 'jimmy' from dual;
  14:  
  15: 1 row created.
  16:  
  17: SQL> commit;
  18:  
  19: Commit complete.
  20:  
  21: SQL> grant select on ods.test_ods to dm;
  22:  
  23: Grant succeeded.
  24:  
  25:  
  26: dm login database
  27:  
  28: SQL> conn dm
  29: Enter password: 
  30: Connected.
  31: SQL> select * from ods.test_ods;
  32:  
  33: NAME
  34: ------------
  35: jimmy
  36:  
  37: SQL> create or replace view v_ods_test
  38:   2  as 
  39:   3     select * from ods.test_ods;
  40:  
  41: View created.

先删除视图v_ods_test,然后收回用户dm创建视图的权限。

   1: sys  login database
   2: SQL> show user
   3: USER is "SYS"
   4: SQL> revoke create view from dm;
   5:  
   6: Revoke succeeded.
   7:  
   8: SQL> 

然后在dm下创建视图时会出现场景一的错误,

   1: SQL> show user
   2: USER is "DM"
   3: SQL> create or replace view v_ods_test
   4:   2  as 
   5:   3     select * from ods.test_ods;
   6: create or replace view v_ods_test
   7:                        *
   8: ERROR at line 1:
   9: ORA-01031: insufficient privileges

但是即使dm没有创建视图的权限了,我依然可以在sys用户下创建dm下视图

   1: SQL> show user;
   2: USER is "SYS"
   3: SQL> create or replace view dm.v_ods_test
   4:   2  as
   5:   3     select * from ods.test_ods;
   6:  
   7: View created.

场景3: 在上面场景中,我们依然给予DM账号创建视图的权限,然后按如下步骤去测试
   1: SQL> show user
   2: USER is "ODS"
   3: SQL> create table ods.test_view
   4:   2  (
   5:   3     name varchar2(12)
   6:   4  )
   7:   5  ;
   8:  
   9: Table created.
  10:  
  11: SQL> insert into ods.test_view
  12:   2  select 'kkk' from dual;
  13:  
  14: 1 row created.
  15:  
  16: SQL> commit;
  17:  
  18: Commit complete.


创建角色role_select_test,然后将表test_view的查询权限授予该角色,最后将该角色授予dm用户

   1: sys user login
   2:  
   3: SQL> show user
   4: USER is "SYS"
   5: SQL> create role role_select_test;
   6:  
   7: Role created.
   8:  
   9: SQL> grant select on ods.test_view to role_select_test;
  10:  
  11: Grant succeeded.
  12:  
  13: SQL> grant role_select_test to dm;
  14:  
  15: Grant succeeded.

但是在dm用户下,创建视图时报错。

   1: SQL> conn dm
   2: Enter password: 
   3: Connected.
   4: SQL> select * from ods.test_view;
   5:  
   6: NAME
   7: ------------
   8: kkk
   9:  
  10: SQL> create or replace view dm.v_ods_test2
  11:   2  as
  12:   3     select * from ods.test_view;
  13:         select * from ods.test_view
  14:                           *
  15: ERROR at line 3:
  16: ORA-01031: insufficient privileges

这时,如果显示将表ods.test_view的查询权限授予dm后,就可以创建视图。

   1: SQL> show user
   2: USER is "ODS"
   3: SQL> grant select on ods.test_view to dm;
   4:  
   5: Grant succeeded.
   6:  
   7:  
   8:  
   9: SQL> show user  
  10: USER is "DM"
  11: SQL> create or replace view dm.v_odst_test2
  12:   2  as
  13:   3     select * from ods.test_view;
  14:  
  15: View created.

结论:

创建create view 的时候,是不可以利用相应的role隐式授权的,必须显式的授予这个对象相应的权限。metalink解释如下:
    reason:Under SQL, if a user can select another user's table and has the privilege to create a view, then the create view  works. Yet, a create view on the other user's table generates ORA-01031 if the select privilege has been granted to a role and not directly.

官方文档关于创建视图的权限:

Privileges Required to Create Views

To create a view, you must meet the following requirements:

You must have been granted the CREATE VIEW (to create a view in your schema) or CREATE ANY VIEW (to create a view in another user's schema) system privilege, either explicitly or through a role.

You must have been explicitly granted the SELECT, INSERT, UPDATE, or DELETE object privileges on all base objects underlying the view or the SELECT ANY TABLE, INSERT ANY TABLE, UPDATE ANY TABLE, or DELETE ANY TABLE system privileges. You may not have obtained these privileges through roles.

Additionally, in order to grant other users access to your view, you must have received object privilege(s) to the base objects with the GRANT OPTION option or appropriate system privileges with the ADMIN OPTION option. If you have not, grantees cannot access your view."

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于sympy的python实现三层BP神经网络算法

#!/usr/bin/python # -*- coding: utf-8 -*- """ 写一个三层的BP神经网络(3,2,1),3是输入数据的维度,隐层设置节点数为2,1是因为每个观测的target都是一个标量即只有一个数; 1.随…

JVM(二)Java虚拟机组成详解

导读:详细而深入的总结,是对知识“豁然开朗”之后的“刻骨铭心”,想忘记都难。 Java虚拟机(Java Virtual Machine)下文简称jvm,上一篇我们对jvm有了大体的认识,进入本文之后我们将具体而详细的…

PyCharm pyqt5 python串口通信封装类SerialCommunication

""" pyqt5串口通信文件SerialCommunication.py """ import binascii import os import serial import serial.tools.list_ports from PyQt5.QtGui import QPixmap# 全局变量,串口是否创建成功标志 Ret False # 串口列表串口号 port_…

InstallShield 杀掉进程

将运行中进程杀掉:卸载时使用(调用CMD命令):szApplicationPath WINSYSDIR^"taskkill.exe "; szApplicationCmdLine "APP.exe"; LongPathToQuote( szApplicationPath, TRUE ); szCmdLine szApplicationPath …

Fiddler利用Xposed框架+JustTrustMe抓取手机APP数据

文章目录 1. Xposed安装2. JustTrustMe安装3. 确保Fiddler在模拟器里配置 此文只是针对Fiddler抓取APP数据失败情况下的方案,主要想解决的是安卓手机APP抓包HTTPS报文通过MITM代理后证书不被信任的问题。网上搜索出这是使用了SSL Pinning技术,网上可以搜…

互动直播的视频录制与合成—支持多人离线重入

实现的效果图: 上图合成了2个人视频,中途有1个人先离开之后又重新加入了房间。 一、业务场景 业务场景是这样的:多个用户(2-4人)直播的视频,合成为一个视频,这期间要满足2个条件:首…

Python界面 PyQT可视化开发(python3+PyQt5+Qt Designer)

前言 以前制作一个Python窗体界面,我都是用GUI窗口视窗设计的模块Tkinter一点一点敲出来的,今天朋友问我有没有Python窗体的设计工具,“用鼠标拖拖”就能完成窗体设计,我查了查相关资料,果然有一款好用的工具——Qt De…

JVM(三)对象的生死判定和算法详解

好的文章是能把各个知识点,通过逻辑关系串连起来,让人豁然开朗的同时又记忆深刻。 导读:对象除了生死之外,还有其他状态吗?对象真正的死亡,难道只经历一次简单的判定?如何在垂死的边缘“拯救”一…

【STM32】修改芯片型号后报 Error 的解决方案

原文:https://blog.csdn.net/xiuhua_wu/article/details/85237418 背景 前几天有个新需求,使用 STM32 的标准库(STD)做个产品的例程。之前已经做了个 HAL 的,但人家客户不干,非要 STD 的。拖了一周&#xf…

系统什么时候会执行adapter的getview函数

listview是一个特殊的控件,他需要的item是由对应的adapter来生成,但是它显示到界面上是和其他的是一样的也就是说getview()一般会在,第一次显示,页面刷新,或者当adapter对应的数据源变化时候会主动调用,not…

Python手写神经网络实现3层感知机

一、BP神经网络结构模型 BP算法的基本思想是,学习过程由信号的正向传播和误差的反向传播俩个过程组成,输入从输入层输入,经隐层处理以后,传向输出层。如果输出层的实际输出和期望输出不符合,就进入误差的反向传…

JVM(四)垃圾回收的实现算法和执行细节

全文共 1890 个字,读完大约需要 6 分钟。 上一篇我们讲了垃圾标记的一些实现细节和经典算法,而本文将系统的讲解一下垃圾回收的经典算法,和Hotspot虚拟机执行垃圾回收的一些实现细节,比如安全点和安全区域等。 因为各个平台的虚拟…

Linux(Ubuntu20.10)安装GIMP

原文:https://www.cnblogs.com/carious/p/10716647.html GIMP 名称由GNU Image Manipulation Program(GNU图像处理程序)的首字母组成)是一个自由及开放原始码的点阵图图像编辑器,用于图像照片润饰及编辑、自由绘图、…

MRC和ARC混编

iOS5.0以后就开始可以使用ARC(Automatic Reference Counting:自动引用计数)来代替之前的MRC(Manual Reference Counting:人工引用计数)。使用ARC会减少很多代码和忘了释放对象的苦恼。但是事情都有两面性。…

python-cx_oracle报错“DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: “

问题的主要原因是python-cx_oracle加载的是32位的instantclient-basic,我们需要让他读到64位的。 弄清版本,最重要!!! 首先安装配置时,必须把握一个点,就是版本一致!包括&#xff1…

JVM(五)垃圾回收器的前世今生

全文共 2195 个字,读完大约需要 8 分钟。 如果垃圾回收的算法属于内存回收的方法论的话,那本文讨论的垃圾回收器就属于内存回收的具体实现。 因为不同的厂商(IBM、Oracle),实现的垃圾回收器各不相同,而本文…

【SlowFast复现】SlowFast Networks for Video Recognition复现代码 使用自己的视频进行demo检测

目录 一,准备 1.1代码1.2 环境准备1.3 搭建镜像1.4 配置slowfast环境1.5 ava.json1.6 SLOWFAST_32x2_R101_50_50.yaml1.7 SLOWFAST_32x2_R101_50_50 .pkl二,代码运行三 错误解决复现过程视频:B站复现视频复现结果 一,准备 1.1代…

十二、ubuntu20.10(Linux)下Pycharm配置pyqt5开发环境

Introduction PyQt是Python语言的GUI编程解决方案之一。可以用来代替Python内置的Tkinter。其它替代者还有PyGTK、wxPython等。与Qt一样,PyQt是一个自由软件。 在Linux下使用pycharm写python是最舒服的。本文介绍了Linux下pycharm qt5开发环境的配置。 0.安装python3 ubunt…

MySQL学生向笔记以及使用过程问题记录(内含8.0.34安装教程

MySQL 只会写代码 基本码农 要学好数据库,操作系统,数据结构与算法 不错的程序员 离散数学、数字电路、体系结构、编译原理。实战经验, 高级程序员 去IOE:去掉IBM的小型机、Oracle数据库、EMC存储设备,代之以自己在开源…

程序员专属精品简历合集—面试必备

听说你最近打算换工作?听说你和好工作之间,只差一个漂亮的简历模板?人们常说“金三银四”,一年之际在于春。不管你是主动离职,还是被动“被离职”(稳住,我们能赢!)&#…