有没有办法,只选择数据形成自己的架构,即使有公共同义词?
类似于: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中存在这样的事情吗?
答案 0 :(得分:1)
scoping rules are quite clear。当数据库解析查询时,它按以下优先顺序查找与语句中的标识符匹配的对象:
但是如果你想明确的话,你可以在表引用前加上特定的模式名称。这有助于将您的意图传达给其他人查看您的代码。
此外,如果您的架构中有一个表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}}拥有的实例公共同义词。