当我有一个 SQL 语句,如 select * from table1
,它工作得很好,但是一旦我把它放到函数中,我就会得到:
ORA-00942: table or view does not exist
如何解决这个问题?
很有可能你被授予了一个角色,该角色拥有从table1中选择数据的权限。但是,即使用户被授予了该角色,通过用户编写的PL/SQL代码是无法获得所授予的角色权限的。
在sys拥有的对象上,经常会看到被授予dba角色的用户。具有dba角色的用户可以执行像SELECT * from V$SESSION
这样的操作,但是无法编写包含SELECT * FROM V$SESSION
的函数。
解决方法是直接向用户授予涉及的对象明确的权限。例如,在上面的情况下,SYS用户必须执行GRANT SELECT ON V_$SESSION TO MyUser;
。
有几个方面你可以考虑。根据你的问题,看起来函数所有者不同于表所有者。
1) 通过角色授权:为了在其他用户的对象上创建存储过程和函数,您需要直接访问这些对象(而不是通过角色访问)。
2)
默认情况下,存储过程和 SQL 方法使用其所有者的权限而不是当前用户的权限执行。
如果你在 Schema A 中创建了一张表,在 Schema B 中创建了一个函数,则应该查看Oracle的Invoker/Definer Rights概念,以了解可能导致该问题的原因。
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/subprograms.htm#LNPLS00809
请确保函数与表在同一个数据库模式中。
select columns from schema.table1
。 - Adriano Carneiro您可能没有访问该模式/表的权限,或者该表不存在。如果您在存储过程中使用其他模式表,则通常会出现此问题。
例如,如果您从用户/模式ABC运行存储过程,并且在同一PL / SQL中有来自用户/模式XYZ的表,则ABC应该具有XYZ表的授权即权限。
授予 ABC 的所有权限:
Grant All On To ABC;
Select * From Dba_Tab_Privs Where Owner = 'XYZ'and Table_Name = <Table_Name>;
DBMS
,表名为info
,那么查询时应该使用DBMS.info
。select * from STUDENTREC where ROLL_NO=1;
select * from DBMS.STUDENTREC where ROLL_NO=1;
SELECT owner FROM all_objects WHERE object_type IN ('TABLE','VIEW') AND object_name = 'STUDENTREC';
- chepyle