是否可以在current_schema中选择独立于公共同义词的表

时间:2012-08-08 07:10:46

标签: sql oracle scope schema synonym

有没有办法,只选择数据形成自己的架构,即使有公共同义词?

类似于: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中存在这样的事情吗?

1 个答案:

答案 0 :(得分:1)

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

  1. 架构中该名称的对象
  2. 该名称的私人同义词(在您的架构中)
  3. 该名称的公共同义词
  4. 但是如果你想明确的话,你可以在表引用前加上特定的模式名称。这有助于将您的意图传达给其他人查看您的代码。

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


      

    “我想知道的是我现在有一个占位符   模式“

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

    SQL>  select * from t23;
    

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

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

    SQL>  alter session set current_schema=scott;
    

    现在,如果你执行了前一个select,那么它将从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时,SCHEMA1的包将是SCHEMA1范围内的{{1}}范围内的实例,{{1}}或{1}}拥有的实例公共同义词。

    Find out more.