2

我正在尝试创建一个运行多个 PL/SQL 语句的过程,但我还没有走得很远。如果我从一个过程中运行它,select 语句可以正常工作,但如果我尝试在一个过程中执行它——它找不到 shttran 表。我猜这可能是架构问题,但我不知道如何纠正。想法?

CREATE OR REPLACE PROCEDURE REGREPORTUSER.findUnsent
IS
BEGIN
   INSERT INTO regreportuser.maltran (maltran.maltran_key,
                                      maltran.maltran_sent)
      SELECT shttran.shttran_id || shttran.shttran_seq_no AS maltran_key,
             'No' AS maltran_sent
        FROM saturn.shttran -- This is the table it can't find
       WHERE     TO_DATE (shttran.shttran_activity_date) > SYSDATE - 14
             AND shttran.shttran_user = 'WWW2_USER'
             AND shttran.shttran_id || shttran.shttran_seq_no NOT IN
                    (SELECT maltran.maltran_key FROM regreportuser.maltran);
END findUnsent;
4

1 回答 1

4

最有可能的问题是拥有存储过程的用户可以通过角色而不是直接授予REGREPORTUSER来访问表。saturn.shttran定义者权限存储过程不能使用通过角色授予定义者的权限。它只能使用直接授予的权限。

您可以通过禁用 SQL*Plus 会话中的角色来验证这实际上是问题所在。如果你运行命令

SQL> set role none;

然后尝试执行 SQL 语句,你应该得到同样的错误。为了解决问题,您需要直接授予资助

GRANT SELECT ON saturn.shttran
   TO REGREPORTUSER
于 2013-06-14T13:26:04.500 回答