【问题标题】:is it possible to selecting table in current_schema independent of public synonym是否可以在 current_schema 中选择独立于公共同义词的表
【发布时间】:2023-03-15 20:50:01
【问题描述】:

有没有办法只从自己的模式中选择数据,即使有公共同义词?

类似:Select * from current_schema.Table1

更多信息:

我在 schema1 上的 table1 上获得了公共同义词。
现在我有一个选择 table1 的包(在 schema2 上),我想选择 schema2 的 table1 而不是 schema1。
我的问题是,当用户在他的服务器上使用包时,我不会更改标识符。

编辑
我看到我的问题不清楚,我想知道我当前的模式是否有占位符?

目前我需要这样做: Select * from schema2.Table1

我想要的是这样的: Select * from MySchema.Table1 或者 Select * from this.Table1 或者 Select * from current_schema.Table1

oracle 中是否存在类似的东西?

【问题讨论】:

  • Tom Kyte would not be being nice to you at the moment。作为一般规则,不要使用公共同义词。你应该有一个非常具体的,好的,这样做的理由。听起来,从您的问题来看,schema1 上的 table1schema2 具有相同的名称,因此您将遇到问题,因为您将全局命名空间弄乱了。

标签: sql oracle scope schema synonym


【解决方案1】:

scoping rules are quite clear。当数据库解析查询时,它会按照以下优先顺序查找与语句中的标识符匹配的对象:

  1. 架构中具有该名称的对象
  2. 该名称的私有同义词(在您的架构中)
  3. 该名称的公共同义词

但如果你想明确一点,你可以在你的表引用前加上特定的模式名称。这有助于将您的意图传达给查看您的代码的其他人。

此外,如果您的架构中有一个表 TABLE1 并且有一个名为 TABLE1 的公共同义词指向您要查询的另一个架构中的一个表,那么您必须在您的引用前面加上该其他架构。


“我想知道的是有没有我当前的占位符 架构”

不,因为没有必要。默认值始终是您当前的架构。也就是这个说法……

SQL>  select * from t23;

...将总是从您当前架构中的 T23 中选择,如果它有一个具有该名称的表(或私有同义词)。

请注意,可以使用 ALTER SESSION 命令更改当前架构的值:

SQL>  alter session set current_schema=scott;

现在,如果您执行之前的选择,它将返回来自 SCOTT.T23 的结果,前提是 SCOTT 模式具有这样的表,并且您对它具有特权。您可以稍后find out more about Oracle schemas in a blog piece I wrote


我试图了解您遇到了什么问题,我注意到您的场景是一个用户执行另一个用户拥有的包。现在,默认情况下,SCHEMA2 拥有的包将针对SCHEMA2 拥有的对象运行,并使用授予SCHEMA2 的其他对象的权限。

但是 PL/SQL 为我们提供了改变这一点的能力:AUTHID 子句确定包是以定义者的权限(即包所有者)还是调用者的权限(当前用户)运行。所以如果SCHEMA2 定义了他们的包使用AUTHID CURRENT_USER,当SCHEMA1 运行它时,TABLE2 的实例将是SCHEMA1 范围内的实例,这将是SCHEMA1 拥有的实例或由公共同义词指示的实例。

Find out more.

【讨论】:

  • 我看到我的问题不清楚,我想知道我当前的架构是否有占位符?
  • 我知道默认是我的架构,但如果设置了公共同义词,则不会。所以简短的回答是没有自己的架构没有占位符。
猜你喜欢
  • 1970-01-01
  • 2010-11-25
  • 2017-02-24
  • 2019-07-09
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
相关资源
最近更新 更多