访问 Oracle 存储过程中另一个用户的表

17

我正在编写一个存储过程,将数据从一个用户的表复制到另一个架构中。基本上,这是一系列INSERT .. SELECT语句,例如:

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

这在使用sqlplus(或对我来说是TOAD ;-))发出命令时运行良好,因此我知道我具有足够的权限,但当它作为存储过程的一部分时,就像这样:

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,但好像没有效果。

还能做什么呢?我已经想到了所有的办法。

1个回答

28

一个过程的所有者必须被授予直接访问底层对象的特权,而不是通过角色。要获得与您的过程相同的访问级别,请使用以下命令:

SET ROLE NONE;

如果您想从存储过程中访问另一个表格,您需要直接被授予SELECT权限,而不是通过角色授权:

GRANT SELECT ON TURAT03.GESCHAEFTE TO <your_user>;

这篇由Tom Kyte撰写的文章包含额外的信息。


谢谢Vincent,回答得真快!我已经直接授予我的用户选择权限了,现在它可以工作了。 - Thorsten
这是非常奇怪的行为,有没有人能提供一个参考,解释为什么会出现这种情况。 - Reimius
1
@reimius: 我们只能猜测“为什么”,因为文档通常不会提到选择某种实现方式的原因。也许Oracle选择不维护过程和角色之间的依赖链接,因为这可能会导致大量反编译影响许多模式当角色被修改时。 - Vincent Malgrat
你的解释确实很有道理。 - Reimius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接