2010-12-09 113 views
13

我正在编写一个存储过程以将数据从一个用户表复制到另一个模式。基本上,它是一系列的INSERT ... SELECT语句,像这样的:在Oracle存储过程中访问另一个用户的表

INSERT INTO GESCHAEFTE 
    SELECT * 
    FROM TURAT03.GESCHAEFTE 
    WHERE kong_nr = 1234; 

这从sqlplus中issueing(或蟾蜍我;-))时正常工作,所以我知道我有足够的权限,但是当这是存储过程的一部分,是这样的:

CREATE OR REPLACE FUNCTION COPY_KONG 
    (pKongNr IN NUMBER) 
    RETURN NUMBER 
    AUTHID CURRENT_USER 
IS 
BEGIN 
    INSERT INTO GESCHAEFTE 
     SELECT * 
     FROM TURAT03.GESCHAEFTE 
     WHERE kong_nr = pKongNr; 
END; 

我得到Oracle错误:

[Error] ORA-00942 (11: 22): PL/SQL: ORA-00942: table or view does not exist 

正如你所看到的,我已经插入一个AUTHID,但无济于事。

我还能做什么?我几乎在我的想法结束。

回答

26

程序的所有者必须被授予直接访问底层对象的权限,not through a role。要访问为你的程序的同一级别,请使用以下命令:

SET ROLE NONE; 

要从程序访问另一个表,您需要直接授予SELECT,而不是通过一个角色:

GRANT SELECT ON TURAT03.GESCHAEFTE TO <your_user>; 

This article by Tom Kyte包含其他信息。

+0

谢谢文森特,快速回答!我能够直接将选择授予我的用户,并且现在可以工作。 – Thorsten 2010-12-09 15:16:30

相关问题