【问题标题】:Oracle Stored Procedure to use another Schema's views [closed]Oracle 存储过程使用另一个模式的视图 [关闭]
【发布时间】:2023-04-07 16:46:01
【问题描述】:

我正在编写一个存储过程来自动执行一项任务,并且在其中一个步骤中我需要从另一个用户架构中的视图中选择数据。

我可以从存储过程之外的视图中查询数据,但显然不在我的架构下的 SP 中。

这是设计使然还是我遗漏了什么?有什么解决方法吗?

谢谢

【问题讨论】:

  • 贴代码哥们!
  • 来自help center:“寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及重现它所需的最短代码问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建minimal reproducible example。"

标签: oracle stored-procedures schema


【解决方案1】:

更多的是评论而不是答案,试图澄清问题。我相信答案可能在以下代码或 Boneist 的评论中。

如果您授予视图所需的权限,我看不出为什么 SP 不应该从另一个模式查询视图。

例如,如果我在架构 HR 中创建一个视图并将SELECT 权限授予我的用户

SQL> conn hr/###@xe
Connected.
SQL> create or replace view testView as select 1 as one from dual;

View created.

SQL> grant select on testView to alek;

Grant succeeded.

然后我在我的架构中构建一个过程

SQL> conn alek/###@xe
Connected.
SQL> create or replace procedure testSelectView is
  2  begin
  3    for i in ( select * from hr.testView) loop
  4      dbms_output.put_line(i.one);
  5    end loop;
  6  end;
  7  /

Procedure created.

在我的架构中,查询和过程都有效:

SQL> select * from hr.testView;

       ONE
----------
         1

SQL> exec testSelectView;
1

PL/SQL procedure successfully completed.

【讨论】:

  • 最有可能在 OP 的情况下,表上的授权已授予一个角色,而该角色已授予 OP 的架构。如果将赠款直接提供给桌子,那将起作用,您已在回答中证明了这一点。
  • @Boneist:鉴于未详细说明的问题,我怀疑 OP 是否存在特权问题(在这种情况下,我相信问题正是您所说的)或者可能与特权无关,因为例如缺少 INTO 或类似的东西。
  • 啊,是的;现在您说我可以看到 OP 问题的模棱两可。哼哼!
【解决方案2】:

您很可能遇到了权限问题。在 PL/SQL 块内,您只有 直接 授予您的权限,通过角色授予的权限(例如 DBA 角色)不适用。

运行grant select on ... to ...;grant select any table to ...;,那么它应该可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 2011-03-25
    • 2017-08-18
    • 1970-01-01
    • 2013-10-12
    相关资源
    最近更新 更多