Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

oracle "table or view does not exist" from inside stored procedure

the scenarion is like this...

I HAVE a namespace XXX where I created some tables and some stored procedures...

THEY HAVE a namespace YYY where they created some tables...

THEY GRANTED XXX access to their tables, so when I conect to SQL Developer using XXX connection, I can do:

SELECT * FROM YYY.TableA

But if I try to run that very same statement from inside a stored procedure (either simple stored procedure or a package), the stored procedure does not compile. It happens to a lot of sp's. Is there any other permission that I have to ask for??? I'm running sp's like this:

CREATE OR REPLACE PROCEDURE PRC_SOMESP(
) AS BEGIN
END PRC_SOMESP;

Procedures that does not access YYY tables do compile well.

Thanks in advance.

After Justin Cave response, I'm trying to add "AUTHID CURRENT_USER" sentence to the sp's but getting the same "table or view does not exist" result:

CREATE OR REPLACE PROCEDURE PRC_PROC1( PARAMETERS... )  
AUTHID CURRENT_USER  
AS  
    MYVAR NUMBER;  
BEGIN  
    STATEMENTS...
END PRC_PROC1;  

CREATE OR REPLACE PACKAGE PKG_PROC2  
AUTHID CURRENT_USER  
AS  
TYPE T_CURSOR IS REF CURSOR;
PROCEDURE PRC_PROC2( PARAMETERS... )  
END PKG_PROC2  

Should I check anything else???

like image 734
user509925 Avatar asked Nov 16 '10 19:11

user509925


People also ask

How resolve table or view does not exist in SQL Developer?

If your table does not show, then it does not exist, and you'll need to look into why it doesn't exist. Or, if you're using SQL Developer, you can check the table exists by expanding the Tables section on the left side of the screen. If you see the table there, it means it exists and you're the owner.

What is Authid Current_user in Oracle package?

AUTHID CURRENT_USERSpecify CURRENT_USER to indicate that the package executes with the privileges of CURRENT_USER . This clause creates an invoker-rights package. This clause also specifies that external names in queries, DML operations, and dynamic SQL statements resolve in the schema of CURRENT_USER .

What could be the reason for failure with error table or view does not exist in Informatica?

This error will occur when the table name prefix is not specified for the table. The Table name prefix is a requirement for loading in bulk mode for Oracle 9i. 1) For Solution, enter CR with a Workaround if a direct Solution is not available.


1 Answers

Most likely, the problem is that the grant was done via a role. Privileges granted to a user are not available in a definer's rights stored procedure (the default).

In SQL Developer, it is relatively easy to verify that this is the problem. If you run the command

SET ROLE none

and then run the SELECT statement, I would expect that you would get the same ORA-00942 error.

Assuming that is the case, the solution would generally be to ask that the owners of the tables in the YYY schema to grant access to the tables directly to you rather than granting access via a role. Barring that, you could define your stored procedure as an invoker's rights stored procedure by adding AUTHID CURRENT_USER to the declaration. That would that the caller of the procedure would need to have access to the underlying objects but it would allow your procedures to make use of privileges granted through a role.

If you want to create an invoker's rights stored procedure, you will also need to refer to the table name using dynamic SQL in order to defer the privilege check to runtime. So you would have something like

CREATE OR REPLACE PROCEDURE PRC_SOMESP 
  AUTHID CURRENT_USER
AS 
  l_cnt pls_integer;
BEGIN
  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM yyy.TableA' INTO l_cnt;
END PRC_SOMESP;

if you wanted an invoker's rights stored procedure that queried the TableA table in schema XXX.

like image 95
Justin Cave Avatar answered Oct 23 '22 18:10

Justin Cave