【问题标题】:Oracle - Stored Procedure with same name across multiple schema - Which would be called by defaultOracle - 跨多个模式具有相同名称的存储过程 - 默认情况下会调用
【发布时间】:2020-03-27 08:16:07
【问题描述】:

如果存在跨不同架构(SYS,用户定义架构)的存储过程,如果我们不提及架构名称,则默认调用哪个架构。

**Schema_1**
Sample_SP

**Schema_2**
Sample_SP

**SYS**
Sample_SP

execute Sample_SP

将执行哪个架构?

【问题讨论】:

  • select sys_context( 'userenv', 'current_schema' ) from dual;

标签: oracle stored-procedures schema


【解决方案1】:

如果您以用户schema_1 的身份连接,则将执行其过程。

其他人可能会被执行,也可能永远不会被执行,这取决于他们的所有者是否授予您execute 对其程序的特权以及是否存在(公共或私有)同义词。

但是,底线是:首先执行您自己的代码,然后 - 如果它不存在 - 在别处搜索它。

【讨论】:

  • 我相信问题不在于查找(和搜索),而在于默认值。如果schema3 中的用户按名称调用该过程,将执行什么?
  • 第 2 和 3 段,@mathguy。也许有,也许没有——这取决于我们不知道的事实。
【解决方案2】:

这取决于如何您调用该过程。如果您使用简单名称(意思是:不以模式名称为前缀),那么 Oracle 将在当前模式中查找。要从任何其他模式调用该过程,您必须使用限定名称。如果您使用简单名称调用该过程,并且 your 架构中不存在该名称的过程,您将收到错误消息 - 您将无法获得“默认”位置来查看。并且,当然,如果您使用限定名称从不同的架构中调用它,但您没有所需的权限,您也会收到错误。

您也可以创建同义词,但只能(在同义词定义中)指向其中一个过程 - 在一个特定模式中。

【讨论】:

【解决方案3】:

它将从连接的模式执行存储过程。 如果没有连接用户定义的模式,则将执行来自 SYS 的存储过程,因为 SYS 是默认的。

【讨论】:

    猜你喜欢
    • 2013-01-26
    • 2020-10-31
    • 2014-09-20
    • 2018-07-12
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多