Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle存储过程中访问其他用户的表_Oracle_Stored Procedures_Privileges_Ora 00942 - Fatal编程技术网

在Oracle存储过程中访问其他用户的表

在Oracle存储过程中访问其他用户的表,oracle,stored-procedures,privileges,ora-00942,Oracle,Stored Procedures,Privileges,Ora 00942,我正在编写一个存储过程,将数据从一个用户的表复制到另一个模式。基本上,这是一系列的插入。。选择如下语句: INSERT INTO GESCHAEFTE SELECT * FROM TURAT03.GESCHAEFTE WHERE kong_nr = 1234; 当从sqlplus或TOAD为我发布时,这可以很好地工作;-所以我知道我有足够的特权,但当这是存储过程的一部分时,如下所示: CREATE OR REPLACE FUNCTION COPY_KONG (pKon

我正在编写一个存储过程,将数据从一个用户的表复制到另一个模式。基本上,这是一系列的插入。。选择如下语句:

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,但是没有用


我还能做什么?我的想法到此为止。

必须授予过程所有者直接访问底层对象的权限。要具有与过程相同的访问级别,请使用以下命令:

SET ROLE NONE;
要从过程中访问另一个表,需要授予您直接选择的权限,而不是通过角色:

GRANT SELECT ON TURAT03.GESCHAEFTE TO <your_user>;

包含其他信息。

谢谢Vincent,快速回答!我可以直接将select授予我的用户,它现在可以工作了。这是一种非常奇怪的行为,有人提到过为什么会这样吗。@reimius:我们只能猜测原因,因为文档通常没有提到使用特定实现的原因。也许Oracle选择不维护过程和角色之间的依赖关系链接,因为当角色被修改时,它可能会导致大量反编译,影响许多模式。您的解释非常有意义。