【问题标题】:Multi-schema select statement doesn't work in PL/SQL procedure?多模式选择语句在 PL/SQL 过程中不起作用?
【发布时间】:2013-06-11 03:53:57
【问题描述】:

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

【问题讨论】:

    标签: sql oracle plsql oracle-sqldeveloper toad


    【解决方案1】:

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

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

    SQL> set role none;
    

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

    GRANT SELECT ON saturn.shttran
       TO REGREPORTUSER
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      相关资源
      最近更新 更多