直接引用Oracle中的公共同义词

时间:2014-06-30 17:07:15

标签: database oracle schema synonym

我知道这是倒退的,但是说我们有一个不灵活的工具或情况总是以

的形式创建SELECT语句
SELECT * FROM ${SCHEMA}.${TABLE};

现在说我们有一个名为MY_TABLE的表的公共同义词,但在当前架构中没有实际的MY_TABLE。那是我们的用户是USER,但MY_TABLE的同义词指向OTHER_USER.MY_TABLE。

请注意,这可以正常工作:从MY_TABLE UNION ALL中选择*从OTHER_USER.MY_TABLE中选择*;

我想做点什么

SELECT * FROM SYNONYMS.${TABLE};

我们可以在$ {SCHEMA}中放置什么来迫使Oracle查找并解析同义词?我已尝试使用以下 literal SQL语句来尝试直接引用同义词,但它们不起作用。

select count(*) from USER.MY_TABLE; 

select count(*) from CURRENT_SCHEMA.MY_TABLE;

select count(*) from .MY_TABLE;

select count(*) from %.MY_TABLE;

请注意,我们必须引用同义词,因为我们经常更改同义词以帮助生成安装,因此我不能将OTHER_USER放在$ SCHEMA中,因为它可能是OTHER_USER或OTHER_USER2或OTHER_USER3,原因是我无法控制代码。

3 个答案:

答案 0 :(得分:2)

您可以使用同义词所有者PUBLIC作为参考架构;作为USERA

create table t42 (id number);
create public synonym t42 for t42;
grant select on t42 to userb;

然后是USERB

select * from "PUBLIC"."T42";

no rows selected

但似乎必须引用“架构”:

select * from public.t42;
select * from public.t42
              *
ERROR at line 1:
ORA-00903: invalid table name


select * from "PUBLIC".t42;

no rows selected

您可能会或可能不会。如果您可以使用双引号将${SCHEMA}等于"PUBLIC",那么它可以解决您的问题。

我不确定为什么必须引用它,大写标识符通常不会;但是PUBLIC不是普通用户,所以也许它不需要特别处理就不足为奇了。

答案 1 :(得分:0)

我并不真正了解您的潜在动机,但在我看来,您可以考虑使用专用的用户架构并在该架构中创建引用最终对象的视图。视图可用作符号链接。

为什么不能

 select count(*) from USER.MY_TABLE; 

引用USER的名为MY_TABLE的模式中的视图,该模式引用当前需要的任何表。您可以重新创建视图,而不是重新创建同义词。

create view USER.MY_TABLE
   as select * from OTHER_USER.MY_TABLE;

答案 2 :(得分:0)

据我所知,似乎不是我们可以用于$ {SCHEMA}的字面值。但是,我们可以灵活地以这种方式查找架构所有者,保存值,然后在$ {SCHEMA}中使用该值。

select TABLE_OWNER from all_synonyms where TABLE_NAME='MY_TABLE' and OWNER='PUBLIC';

此查询正确返回OTHER_USER,然后我们可以使用它。