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

Posted

技术标签:

【中文标题】在 Oracle 存储过程中访问另一个用户的表【英文标题】:Accessing another user's table within an Oracle Stored Procedure 【发布时间】:2011-05-22 22:06:41 【问题描述】:

我正在编写一个存储过程来将数据从一个用户的表复制到另一个模式。基本上,它是一系列 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】:

过程的所有者必须被授予特权以直接访问底层对象not through a role。要获得与您的过程相同的访问级别,请使用以下命令:

SET ROLE NONE;

要从过程中访问另一个表,您需要直接获得 SELECT 权限,而不是通过角色:

GRANT SELECT ON TURAT03.GESCHAEFTE TO <your_user>;

This article by Tom Kyte 包含附加信息。

【讨论】:

谢谢文森特,快速回答!我能够直接将选择授予我的用户,它现在可以工作了。 这是非常奇怪的行为,有没有人可以参考一下为什么会这样。 @reimius:我们只能猜测“为什么”,因为文档通常没有提到进行特定实现的原因。也许 Oracle 选择不维护过程和角色之间的依赖链接,因为它可能导致在修改角色时影响许多模式的大量反编译。 你的解释确实很有道理。

以上是关于在 Oracle 存储过程中访问另一个用户的表的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程中,调用同义词报表和视图不存在。

在 Oracle 中从另一个存储过程调用一个存储过程

存储过程里不能访问其他用户的表

Oracle存储过程中怎样操作另一个Oracle数据库

以另一个用户身份执行 Oracle 存储过程

如何在 oracle 中将 select 与 if 条件一起用于不同的表,而不是编写函数或存储过程?