关于创建视图遇到ORA-01031错误信息,请参考我以前整理的一篇文章Create view failed with ORA-01031:insufficient privileges,本来以为我那篇文章已经已经囊括了很多案例,但是今天遇到一个特殊案例,折腾了我比较久。下面通过几个例子来演示一下遭遇ORA-01031的来龙去脉。

在测试环境准备两个用户dm、ods并授予一定的权限,准备好我们演示的案例。

SQL> show user;

USER is "SYS"

 

SQL> create user dm identified by dm;

 

User created.

 

SQL> create user ods identified by ods;

 

User created.

 

SQL> grant connect , resource to dm;

 

Grant succeeded.

 

SQL> grant create view to dm;

 

Grant succeeded.

 

SQL> grant connect , resource to ods;

 

Grant succeeded.

案例1: 将VIEW的SELECT权限授予其它用户时,遭遇ORA-01720错误

SQL> conn ods/ods

Connected.

 

SQL> create table department

  2  (

  3      dept_id        number(10)  ,

  4      dept_name      varchar2(12) 

  5  );

 

Table created.

 

SQL> grant select on department to dm;

 

Grant succeeded.

 

SQL> conn dm/dm

Connected.

 

 

SQL> create table employee

  2  (

  3      employee_id    number(10)  ,

  4      employee_name  varchar2(32),

  5      dept_id        number(10)

  6  );

 

Table created.

 

SQL> show user

USER is "DM"

 

SQL> create table employee

  2  (

  3      employee_id      number(10)  ,

  4      employee_name    varchar2(32),

  5      dept_id          number(10)

  6  );

 

Table created.

 

SQL> select * from v_test;

 

no rows selected

 

SQL> grant select on dm.v_test to ods;

grant select on dm.v_test to ods

                   *

ERROR at line 1:

ORA-01720: grant option does not exist for 'ODS.DEPARTMENT'

 

出现这个错误,是因为用户ods将表DEPARTMENT的SELECT权限授予了用户dm,而dm将试图v_test的查询权限授予ods时,也试图将表DEPARTMENT授予用户ods,但是dm并没有这个权限(是不是很绕口),其实解决这个问题很简单,即在授权时要使用WITH GRANT OPTION,如下所示即可解决:

SQL> conn ods/ods 

Connected.

 

SQL> grant select on department to dm with grant option;

 

Grant succeeded.

 

SQL> conn dm/dm;

Connected.

 

SQL> grant select on dm.v_test to ods;

 

Grant succeeded.

 

SQL> conn ods/ods

Connected.

 

SQL> select * from dm.v_test;

 

no rows selected

案例2: 将VIEW授权给其它用户(sys账号下),查询时遭遇ORA-01031: insufficient privileges

SQL> show user;

 

USER is "ODS"

 

SQL> create or replace function get_deptcode( departname varchar2) return varchar2

  2  as

  3  dept_code varchar2(2);

  4  begin

  5     select substr(departname,1,1) into dept_code from dual;

  6     return dept_code;

  7  end;

  8  /

 

Function created.

 

SQL> grant execute on get_deptcode to dm;

 

Grant succeeded.

 

SQL> conn dm/dm

Connected.

 

SQL> create or replace view v_test

  2  as

  3     select e.employee_id

  4           ,e.employee_name

  5           ,(select ods.get_deptcode(d.dept_name) from dual) dept_code

  6     from employee e

  7     inner join ods.department d on e.dept_id =d.dept_id;

 

View created.

 

SQL> select * from v_test;

 

no rows selected

以sys登录授权ods拥有查询视图的权限,之所以用sys执行授权,而不用对应账号dm,是因为我发布脚本时,一般都用sys账号发布,结果就遭遇了比较隐秘的ORA-01031错误。

SQL> conn sys as sysdba

Enter password: 

Connected.

 

SQL> grant select on dm.v_test to ods;

 

Grant succeeded.

 

SQL> conn ods/ods

 

Connected.

 

SQL> select * from dm.v_test;

select * from dm.v_test

                 *

ERROR at line 1:

ORA-01031: insufficient privileges

如果以dm账号登录,将视图v_test的权限授予给ods,就能发现这个错误,而以sys账号操作,反而隐藏了该错误。如下所示

SQL> conn dm/dm

Connected.

 

SQL> grant select on v_test to ods;

grant select on v_test to ods

                *

ERROR at line 1:

ORA-01720: grant option does not exist for 'ODS.GET_DEPTCODE'

 

 

SQL> conn ods/ods

 

Connected.

 

SQL> grant execute on ODS.GET_DEPTCODE to dm with grant option;

 

Grant succeeded.

 

SQL> conn dm/dm

 

Connected.

 

SQL> grant select on v_test to ods;

 

Grant succeeded.

GRANT/SELECT View时的遭遇ORA-01720和ORA-01031错误的更多相关文章

  1. 关于SubSonic3.0插件使用SqlQuery或Select查询时产生的System.NullReferenceException异常修复

    早上在编写执行用例时,突然爆异常System.NullReferenceException: 未将对象引用设置到对象的实例 执行代码:

  2. Android自定义View研究--View中的原点坐标和XML中布局自定义View时View触摸原点问题

    这里只做个汇总~.~独一无二 文章出处:http://blog.csdn.net/djy1992/article/details/9715047 Android自定义View研究--View中的原点坐 ...

  3. 直接添加viewController中的view时的注意事项

    直接添加viewController中的view时需要注意一个问题,比如: MyTestViewController *vc = [MyTestViewController new]; [self.v ...

  4. MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?

    原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了, ...

  5. scroll或是其子类被添加进view时,界面自动上移

    开发中经常会遇到ViewController添加scroll或是其子类被添加进controller.view时,scroll会自动下移大概64像素 解决: self.edgesForExtendedL ...

  6. oracle中的listener.ora和tnsnames.ora

    一.oracle的客户端与服务器端 oracle在安装完成后服务器和客户端都需要进行网络配置才能实现网络连接.    服务器端配置监听器,客户端配置网络服务名. 服务器端可配置一个或多个监听程序 . ...

  7. oracle: listener.ora 、sqlnet.ora 、tnsnames.ora的配置及例子

    1.解决问题:TNS或者数据库不能登录.      最简单有效方法:使用oracle系统提供的工具 netca 配置(把原来的删除掉重新配置)     $netca  2.然而,仍有疑问:如何指定'l ...

  8. oracle三个连接配置文件 listener.ora、sqlnet.ora、tnsnames.ora

    关于PLSQL连接ORACLE配置字符串 首先要讲一下下面的一些知识 1.ORACLE_SID:(ORACLE SYSTEM IDENTIFIER) Oracle实例是由SGA和一组后台进程组成的,实 ...

  9. oracle错误(ORA:12154 ORA:01034 和 ORA:27101 ORA-18008 ORA-01081)

    按照正常操作流程,启动项目,发现项目报错,原因是连接不上oracle数据库, PLSQL连接时报错,错误码  ORA:12154 无法解析指定的连接标识符 第一次,遇到这个错误,在网上找了资料都是需要 ...

随机推荐

  1. 小菜学习Winform(七)系统托盘

    前言 有些程序在关闭或最小化的时候会隐藏在系统托盘中,双击或右击会重新显示,winform实现其功能很简单,这边就简单的介绍下. 实现 在winform实现托盘使用notifyIcon控件,如果加菜单 ...

  2. C算法编程题(六)串的处理

    前言 上一篇<C算法编程题(五)“E”的变换> 连续写了几篇有关图形输出的编程题,今天说下有关字符串的处理. 程序描述 在实际的开发工作中,对字符串的处理是最常见的编程任务.本题目即是要求 ...

  3. IOS 开发中要注意的事项

    1.关于拍摄 TGCameraViewController – 基于 AVFoundation 的自定义相机.样式漂亮,轻量并且可以很容易地集成到 iOS 项目中.不会内存吃紧 2.block 中对控 ...

  4. 【Java心得总结三】Java泛型上——初识泛型

    一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...

  5. 相克军_Oracle体系_随堂笔记009-检查点队列

    1.检查点队列 checkpoint queue RBA 日志块地址 redo block address LRBA 第一次被脏的地址 HRBA 最近一次被脏的地址 on disk rba 重做日志( ...

  6. JavaScript的三种工业化调试方法

    JavaScript的三种工业化玩法 软件工程中任何的语言如果想要写出健壮的代码都需要锋利的工具,当然JavaScript也不例外,很多朋友刚入门的时候往往因为工具选的不对而事半功倍,JavaScri ...

  7. Cloud Design Patterns: Prescriptive Architecture Guidance for Cloud Applications 云设计模式:云应用的规范架构指导

    1.Cache-aside Pattern 缓存模式 Load data on demand into a cache from a data store. This pattern can impr ...

  8. jQuery-1.9.1源码分析系列(十) 事件系统——事件包装

    首先需要明白,浏览器的原生事件是只读的,限制了jQuery对他的操作.举个简单的例子就能明白为什么jQuery非要构造一个新的事件对象. 在委托处理中,a节点委托b节点在a被click的时候执行fn函 ...

  9. Java进击C#——语法之基础

    本章简言 上一章讲到关于项目工程开发常用的知识点,有了前面俩章的介绍之后.本章正式开始介绍关于C#的基础语法.我们都很清楚C#也是面向对象的计算机语言.而且他跟JAVA的相似度高达80%.所以很多语法 ...

  10. C++如何调用C#开发的dll

    序言 本文介绍一个C++如何调用C#开发的dll实例. 前言 C++编写的程序为非托管代码,C#编写的程序为托管代码.托管代码虽然提供了其他开发平台没有的许多优势,但由于前期系统及历史版本很多使用的是 ...