oracle编译存储过程提示表或视图不存在的问题分析
来源:互联网 发布:新加坡贸易数据 编辑:程序博客网 时间:2024/05/16 11:44
今天有同事跟我反映有个存储过程编译报错,提示表或视图不存在。存储过程中调用的那个表t是另一个用户b的表。但是当前用户a已经拥有dba角色了,为什么访问不到用户b的表t呢?另一同事说,只要给用户a分配操作用户b的表t的权限就可以了。他的解释是用户即便拥有dba的角色也不一定能操作别的用户的对象。很明显这个解释是错误的。dba角色是数据库管理员的角色,肯定能操作数据库中所有用户的对象。我开始怀疑问题是不是出在存储过程上了。
经过查看资料,发现存储过程可以定义为定义者权限(DEFINER)或者调用者权限(CURRENT_USER)。默认情况下是定义者权限。定义者权限将会禁止调用者的所有role权限。这也就解释了上面案例中为什么用户a拥有了dba的角色,却不能在存储过程中调用用户b的表t。调用者权限不会禁止调用者所获得的所有role权限。但是,不管是定义者权限还是调用者权限,存储过程在编译的时候,都不会判断role角色的权限,所以如果没有给用户a分配操作用户b的表t的权限的话,使用静态sql是无法编译通过的。只能使用动态sql(编译的时候不判断,执行的时候判断)。
下面我将写两个测试的存储过程分别定义为定义者权限和调用者权限:
1.定义者权限
CREATE OR REPLACE PROCEDURE test1 AUTHID DEFINER AS
v_sql varchar2(2000) := '';
BEGIN
v_sql := 'update b.t set pydm =''LM1'' where yhid =''162''';
EXECUTE IMMEDIATE v_sql;
END test1;
2.调用者权限
CREATE OR REPLACE PROCEDURE test2 AUTHID CURRENT_USER AS
v_sql varchar2(2000) := '';
BEGIN
v_sql := 'update b.t set pydm =''LM1'' where yhid =''162''';
EXECUTE IMMEDIATE v_sql;
END test2;
经过测试发现,在不给用户a分配操作用户b的表t的权限的情况下,如果用户a拥有dba角色,exec test1 会提示表或视图不存在的错误,而exec test2 会执行成功。
- oracle编译存储过程提示表或视图不存在的问题分析
- oracle编译存储过程提示表或视图不存在的问题分析
- Oracle存储过程ORA-00942: 表或视图不存在问题解决
- oracle 表或视图不存在的问题
- oracle插入数据时提示视图或表不存在问题
- ORACLE动态sql在存储过程中出现表或视图不存在的解决方法
- oracle删除用户时提示表或视图不存在的问题
- oracle 删除用户时" 表或视图不存在"的问题
- ORACLE存储过程运行报“ora-00942表或视图不存在”、“ORA-01031:权限不足”的解决方式
- oracle 存储过程查询dba_free_space ORA-00942:表或视图不存在
- 存储过程中遇到ora-00942表或视图不存在
- oracle表或视图不存在
- oracle存储过程中使用其他用户的表或视图
- ORACLE的问题解决:Ora-00942:表或视图不存在
- ORACLE的问题解决:Ora-00942:表或视图不存在
- ORACLE的问题解决:Ora-00942:表或视图不存在
- Oracle 当前用户给另一个用户授权查询指定表或视图的权,否则另一个用户提示不存在视图或表
- 表或视图不存在 Hibernate Oracle
- [bzoj3698]XWW的难题 有源汇的上下界最大流
- 【bzoj1731】[Usaco2005 dec]Layout 排队布局
- 解决SurfaceView调用setZOrderOnTop(true)遮挡其他控件的问题
- String所有方法
- Ajax获取数据的几种格式和解析方式
- oracle编译存储过程提示表或视图不存在的问题分析
- 数据结构 学习笔记(十一):排序(下):快速 / 表 / 桶 / 基数 排序,排序算法的比较
- spark基础知识之 spark RDD <四>
- CSDN-markdown
- Vue.js 基本功能了解
- pyinstaller 打包程序 出现错误的解决方法
- 跟我一起读postgresql源码(六)——Executor(查询执行模块之——查询执行策略)
- 基于Json序列化和反序列化通用的封装
- git基本操作