存储过程里不能访问其他用户的表

今天遇到一个很奇怪的问题,有两个用户ESEG和failly88,都是dba角色权限,我现在在hbibillms用户下建立了一个存储过程,访问到ESEG用户下的表:

CREATE OR REPLACE PROCEDURE userdatacopytoESEG IS
/*===============================================================+
版权信息: 版权所有(c)
作业名称:
作业功能:通过用曲线代码和剩余年限进行数据查询
责任人 : 钟军
版本号 : v1.0.0.0
加载策略:
目标表 : ESEG.sg_user-经济情景发生器中的用户信息表
源表 : BDF2_USER - 偿付能力二全面风险管理系统中的用户信息表

代码工具: PL/SQL Developer
创建日期: 2017-05-03---压力测试中用户权限管理
+===============================================================*/
BEGIN
--清空现有经济情景发生器中的用户信息数据
delete ESEG.sg_usertest;
commit;
---插入数据
INSERT INTO ESEG.sg_usertest
(ID, PID, HANDNO, NAME, FULLNAME, ISEXPIRE, EMAIL,PASSWORD)
select sys_guid(),
t.company_id_,
t.username_,
t.ename_,
t.cname_,
t.enabled_,
t.email_,‘YwJmAGUCbAhvCm4IaQpoAGgCbwBuAmUIZApnCH4KUQBQAlcAVgJdCFwKWwhWClkAWAI=‘
from BDF2_USER t; COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(‘Exception happened,data was rollback‘);
ROLLBACK;
END;

编译时报错,说ESEG.sg_usertest表或视图不存在。

我将这两句抠出来,放到sql窗口实行了下,没问题,可以访问的,可是为什么到了存储过程里面就找不到了呢?

在网上查了下,找到问题的根源了:

“在oracle的pl/sql块(过程、函数和包也是命名pl/sql块)中对数据的访问权限和单纯在sqlplus中有时候是不一样的,块中访问数据必须通过显式授权,也就是通过grant   ...   to   userxxx的方式而不是通过隐式方式(通过role授权)。检察权限分配,就应该能解决问题了”

我试着为hbibillms用户显示分配了对这两张表的操作权限:

grant delete,insert on ESEG.sg_usertest to failly88;

grant all on hbibilldata.feetraderecordhistoryto hbibillms;

时间: 2024-08-06 07:25:40

存储过程里不能访问其他用户的表的相关文章

IT忍者神龟之oracle 中一个用户怎么可以不使用用户名访问其他用户的表

故事背景是这样的:一个项目大概涉及到4个工程同时开发,在我自己的工程中需要做一个报表,但是要访问另一个工程所连接的DB,当然两个工程的DB Server是在同一个IP上,也就是说我们之间只是schema不一样,那我怎样完成下面的报表的开发呢? 一开始我直接创建了一个DBLink,但是回头和同时沟通,他认为DBLink的影响过大,当两个数据库不在同一个服务器上的时候才会用到这个,当前的情况最好用schema,但是此处还是把创建DBLink的方法写出来方便记忆: create database li

授予 SELECT ANY TABLE 权限后无法访问sys 用户的表

SQL> show parameter dict NAME                                 TYPE        VALUE ------------------------------------ ----------- ------------------------- O7_DICTIONARY_ACCESSIBILITY          boolean     FALSE ---------缺省为false ----设置为true后普通用户拥有 sel

Oracle数据库访问其他用户下的表,不加表所属的用户名的实现方法

一. 问题: 如何实现在Oracle数据库中访问其他用户的表时不需加表所属的用户名 二. 举例: Oracle里面的用户A,要访问用户B的表需要带用户B的前缀,如访问用户B的 TEST表,需要这样访问 select * from B.TEST;现在就是问如何才能无需添加用户名的前缀. 三. 原因: 方便访问常用表 隐藏表的用户 四. 解决方案: 1. 创建同义词(最好的方式) 语法: CREATE [PUBLIC] SYNONYM synonym_name FOR [schema.] objec

SQL 用户定义表类型,在存储过程里使用数据类型作參数

在数据库编程里使用数据类型,能够提高代码的重用性.它们常常被使用在方法和存储过程中.使用数据类型,我们能够避免在存储过程里定义一串的參数,让人眼花缭乱,它就相当于面向对象语言里.向一个方法里传入一个对象,而该对象有各种属性,存储过程仅仅须要获取这个对象就能获取到各个參数,然后做出对应的处理.有所不同的是SQL的表类型是能够包括多条数据的.到底是怎么一回事,且看以下的样例. 1. 首先我创建了一个学生表,包括四个字段,主键是从1開始的自增长型. GO CREATE TABLE STUDENT( I

dblink 的源数据表结构修改后在存储过程里执行报错

原情况:A服务器表A服务器B也有一张表A服务器B上有一个存储过程要把本地的head表向A服务器表里插入数据.变更后:在A服务器表里增加了一个字段inserttime,服务器B存储过程本地表向A服务器插入时,记录插入的时间.问题修改语句如下:insert into [email protected]  select t.*,sysdate from A;这个语句单独执行没有问题.但在存储过程里执行一直报错,报值过多. 解决: 猜想可能是dblink的问题,把原来的dblink删除,重新新建一个db

【转】Oracle - 数据库的实例、表空间、用户、表之间关系

[转]Oracle - 数据库的实例.表空间.用户.表之间关系 完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区. 在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个Oracle数据库实例来访问和控制磁盘

Oracle - 数据库的实例、表空间、用户、表之间关系

完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区. 在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个Oracle数据库实例来访问和控制磁盘中的数据文件.Oracle有一个很大的内存快,成为全局区(SGA

[转]Oracle - 数据库的实例、表空间、用户、表之间关系

本文转自:http://www.cnblogs.com/adforce/p/3312252.html 完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区. 在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个

oracle下导出某用户所有表的方法

scott/tiger是用户名和密码,handson是导出的实例名 按用户方式导出数据(owner当中写的是用户名) exp scott/[email protected] file=scott_back owner=scott 按表方式导出数据(talbes当中写的是全部表的名称) exp scott/[email protected] tables=(emp, dept) file=scott_back_tab 按表空间方式导出数据(tablespaces当中写的是表空间名称) exp sy