在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选择不维护过程和角色之间的依赖关系链接,因为当角色被修改时,它可能会导致大量反编译,影响许多模式。您的解释非常有意义。