0

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

就像是:Select * from current_schema.Table1

更多信息:

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

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

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

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

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

4

1 回答 1

1

范围规则非常明确。当数据库解析查询时,它会按照以下优先顺序查找与语句中的标识符匹配的对象:

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

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

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


“我想知道的是我当前的模式是否有占位符”

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

SQL>  select * from t23;

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

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

SQL>  alter session set current_schema=scott;

现在,如果您执行之前的选择,它将返回来自 SCOTT.T23 的结果,前提是 SCOTT 模式具有这样的表,并且您对它具有特权。您可以在我不久前写的一篇博客文章中找到有关 Oracle 模式的更多信息


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

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

找到更多。

于 2012-08-08T09:24:59.823 回答