多模式select语句在PL / SQL过程中不起作用?

时间:2013-06-14 13:21:19

标签: sql oracle plsql oracle-sqldeveloper toad

我正在尝试创建一个运行多个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;

1 个答案:

答案 0 :(得分:4)

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

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

SQL> set role none;

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

GRANT SELECT ON saturn.shttran
   TO REGREPORTUSER