Vij*_*ade 4 sql oracle stored-procedures ora-00942
我正在使用insert语句并尝试将数据插入数据库表.我正在使用存储过程.
但是这样做我得到了这个错误.
消息:ORA-00942:表或视图不存在ORA-06512
我检查了表/存储过程是否存在,一切都到位.表名或sp中也没有拼写错误.如果我从查询编辑器运行SP的一部分它工作正常,但当我执行整个SP它会抛出一个错误.
我尝试了Stephen提供的步骤,但是因为我在运行Grant命令时使用相同的用户/所有者登录,所以它给出了一个错误,说"不能自行授予/撤销".
还有一个补充.我有一个存储过程SP1,我在其中使用select语句
Select a from table_name where condition;
Run Code Online (Sandbox Code Playgroud)
当我单独执行此操作时,它会返回一些结果.但是当我执行sp时,它会在写入的同一行给出错误.
任何人都可以帮我解决这个问题.我正在使用SQL +.
在此先感谢Vijay
Ste*_*age 11
贾斯汀的回答是正确的,但让我扩展一下.
每个说表不存在的人都没有看完你的整篇文章.既然你能够:
如果我从查询编辑器运行SP的一部分它工作正常
桌子显然就在那里.显然你有一些访问权限.否则,这显然无效.
但是当我执行整个SP时,它会抛出一个错误.
这是因为Oracle区分了直接授予的权限和通过角色授予的权限.
说我这样做:
Create Table TABLE_A
Create Role READ_ONLY
Grant Select on TABLE_A to READ_ONLY
Grant READ_ONLY to VIJAY
Run Code Online (Sandbox Code Playgroud)
在SQL窗口/提示符中,您可以毫无问题地查询该表.所以现在你需要创建一个视图
Create VIJAY.VIEW_A as SELECT * FROM TABLE_A
Run Code Online (Sandbox Code Playgroud)
您将收到TABLE_A确实存在的错误.因为视图是编译的,就像它运行的过程没有任何角色一样.由于它在没有READ_ONLY角色的情况下运行,因此对TABLE_A存在这一事实视而不见.现在我需要做的是
Grant Select on TABLE_A to VIJAY.
Run Code Online (Sandbox Code Playgroud)
既然您拥有直接权限,则可以编译使用该表的视图或过程/包.
表是否存在于存储过程存在的模式中?如果没有,最简单的解释是,您的过程的所有者已被授予通过角色而不是通过直接授权访问该表的权限.定义者权限存储过程需要直接访问它访问的对象.一种快速测试方法是禁用会话角色,即
SQL> set role none;
SQL> <<execute your query>>
Run Code Online (Sandbox Code Playgroud)
如果这会产生错误,则问题是缺少直接授权.
| 归档时间: |
|
| 查看次数: |
24205 次 |
| 最近记录: |