跨用户创建view ORA-00942: 表或视图不存在错误(转)

今天在我的ORACLE 9.2.0.1 /WINXP平台创建跨用户的VIEW发现一个奇怪问题。
我执行了grant dba to userc,然后运行
create or replace   view  userc.view
  2   As
  3   select a.pkg_id,a.scheme_id,c.item_code,c.adjustrate_id,
  4     to_char(c.valid_date,‘YYYYMMDD‘) valid_date,
  5     to_char( c.expire_date,‘YYYYMMDD‘) expire_date
  6     from usera.table_a c,userb.table_b a
  7     where c.scheme_id = a.scheme_id and a.event_id=1
  8     group  by  a.pkg_id,to_char(c.valid_date,‘YYYYMMDD‘),
  9     a.scheme_id,c.item_code,c.adjustrate_id,to_char( c.expire_date,‘YYYYMMDD‘)
 10  ;

create or replace   view  userc.view
 As
 select a.pkg_id,a.scheme_id,c.item_code,c.adjustrate_id,
   to_char(c.valid_date,‘YYYYMMDD‘) valid_date,
   to_char( c.expire_date,‘YYYYMMDD‘) expire_date
   from usera.table_a c,userb.table_b a
   where c.scheme_id = a.scheme_id and a.event_id=1
   group  by  a.pkg_id,to_char(c.valid_date,‘YYYYMMDD‘),
   a.scheme_id,c.item_code,c.adjustrate_id,to_char( c.expire_date,‘YYYYMMDD‘)

ORA-00942: 表或视图不存在
实际上表都是存在的并且SELECT部分使用USERC也是可以运行正常的,奇怪。后来试试显式赋权运行

SQL> grant all on usera.table_a to userc;

Grant succeeded

SQL> grant all on userb.table_b to userc;

Grant succeeded

SQL> 
SQL> create or replace   view  userc.view
  2   As
  3   select a.pkg_id,a.scheme_id,c.item_code,c.adjustrate_id,
  4     to_char(c.valid_date,‘YYYYMMDD‘) valid_date,
  5     to_char( c.expire_date,‘YYYYMMDD‘) expire_date
  6     from usera.table_a c,userb.table_b a
  7     where c.scheme_id = a.scheme_id and a.event_id=1
  8     group  by  a.pkg_id,to_char(c.valid_date,‘YYYYMMDD‘),
  9     a.scheme_id,c.item_code,c.adjustrate_id,to_char( c.expire_date,‘YYYYMMDD‘)
 10  ;

View created

OK了,不知道是不是ORACLE的BUG还是本来就要求如此,查ORACLE手册
The owner of the view (whether it is you or another user) must have been
explicitly granted privileges to access all objects referenced in the view
definition. The owner cannot have obtained these privileges through roles

原本要求就是必须显式赋权,可惜ORACLE错误实在不够清楚

综上所述
我的理解是:
对于存储过程中的对象角色权限不能被直接使用,而需要显示的给相关的对象授权,否则存储过程编译会报错,如上述的存储过程内部需要select对象DEPT,当不显示的授给select权限时,哪怕当前用户有DBA角色,编译仍然报对象不存在的错误;
而当我们显示的授给用户相关权限时,过程编译正常
这里可以通过下面的三种方式显示授权:
1.GRANT SELECT ANY TABLE TO YUJX;
2.GRANT SELECT ON DEPT TO YUJX;
3.GRANT SELECT ANY TABLE TO PUBLIC或者GRANT SELECT ON DEPT TO PUBLIC;

说明
这里只是通过工作中遇到的一个问题引出了oracle的定义者权限相关内容,解决此问题过程中,我查阅了相关的资料,发现这是oracle的定义者和调用者权限的内容【上述问题就是定义者权限中的限制】;
大家如果有兴趣进一步研究下oracle定义者和调用者权限相关内容,请查阅相关资料进一步学习,或者可以看下Thomas Kyte的《oracle专家高级编程》中的第23章内

时间: 2024-10-28 07:17:39

跨用户创建view ORA-00942: 表或视图不存在错误(转)的相关文章

数据库初识 用户创建授权 库与表内容的增删改查

初识数据库 为什要用数据库 第一,将文件和程序存在一台机器上是很不合理的. 第二,操作文件是一件很麻烦的事 数据库的优势 1.程序稳定性 :这样任意一台服务所在的机器崩溃了都不会影响数据和另外的服务. 2.数据一致性 :所有的数据都存储在一起,所有的程序操作的数据都是统一的,就不会出现数据不一致的现象 解决了多个服务同时使用数据的一致性间题 3.并发 :数据库可以良好的支持并发,所有的程序操作数据库都是通过网络,而数据库本身支持并发的网络操作,不需要我们自己写socket 解决了并发问题 4.效

Oracle数据库scott用户创建view视图权限

以sysdba身份登陆, sqlplus / as sysdba 然后授权给scott用户 grant create view to scott

Oracle 导出、导入某用户所有数据(包括表、视图、存储过程...)

前提:在CMD 命令下 导出命令:exp 用户名/密码@数据库 owner=用户名 file=文件存储路径(如:F:\abcd.dmp) 测试截图:exp ZM/[email protected] owner=ZM file=F\abcd.dmp 导入命令:imp 用户名/密码@数据库 fromuser=用户名 touser=用户名 file=d:\cu.dmp ignore=y imp:命令类型 cu/[email protected]:导入的数据库登陆(用户名/密码@数据库) fromuse

SAP应用创新-维护控制表、视图统一路径

SAP应用创新-维护控制表.视图统一路径 背景: Sap 里面通过技术支持人员维护表的值控制业务操作的表不少,一般通过事物代码或记录在系统外的文档或在某个程序上放置一个按钮.缺点:分散,不易记,不好找,人员更替后 信息无法传承. 例如:多少配置新公司,新的销售组织忘记配置对应的销售订单号,交货单号规则? (通过配置的自定义表规则) 而SAP的标准配置表则挂在配置指南(SPRO) ,具有条例性 ,且一个配置表可以挂不同目录下(都需要) 目的: 1. 把自定义的维护表用SAP的方法挂在SPRO目录下

oracle表空间与用户创建

-------------------------创建表空间与用户 创建临时表空间 CREATE TEMPORARY TABLESPACE test_temp TEMPFILE '/u01/oracle/product/10.2.0/oradata/orcl/test_temp01.dbf ' SIZE 32M AUTOEXTEND ON NEXT 32M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL; 创建用户表空间 CREATE TABLESPACE test_

第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表

第三百七十六节,Django+Xadmin打造上线标准的在线教育平台-创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为app_operation的用户操作APP,写数据库操作文件models.py models.py文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from __future__ import unicode_literals from datetime i

Oracle>>通过PL/SQL程序块判断,指定用户的指定数据表和序列是否存在,如果存在则删除,否则新创建。并且为表添加含有字符串数据,execute immediate执行insert语句中有字符串解决办法

--变量声明 declare num0 number; num1 number; begin --判断用户为:SYSTEM的数据库中是否存在相关数据表和序列,存在则删除,不存在则新创建,DBMS_OUTPUT.put_line等同java中的System.out.println输出语句 DBMS_OUTPUT.put_line('正在初始化数据库信息,请稍后......'); --以下参数说明: --所涉及到的参数值必须为大写 --sequence_owner:指定哪个数据库用户的序列: seq

3、Orcal表空间分配、新建用户、新用户创建连接

1.创建表空间: 在管理员连接打开sql面板,输入如下内容: CREATE TABLESPACE DXYX DATAFILE 'E:\app\Administrator\product\11.2.0\dbhome_1\oradata\DXYX.DBF' SIZE 100M AUTOEXTEND ON NEXT 32M MAXSIZE UNLIMITED 运行上面的SQL之后,在上面指定的路径中就可以看到我们创建的表空间了: 2:创建新用户: 展开管理员连接,然后按照下图操作: 点击应用之后: 这

Oracle12C用户创建、授权、登录

col pdb_name for a30 Oracle12C用户创建.授权.登录 1.以系统用户登录 命令 sqlplus sys/dwh as sysdba; 2. 确认选择CDB select name,cdb from v$database; col pdb_name for a30 select pdb_id,pdb_name,dbid,status,creation_scn from dba_pdbs; select con_id,dbid,NAME,OPEN_MODE from v$