我知道这是倒退的,但是假设我们有一个不灵活的工具或情况总是以
的形式创建 SELECT 语句SELECT * FROM ${SCHEMA}.${TABLE};
现在假设我们有一个名为 MY_TABLE 的表的公共(public)同义词,但在当前模式中没有实际的 MY_TABLE。也就是说,我们的用户是 USER,但 MY_TABLE 的同义词指向 OTHER_USER.MY_TABLE。
请注意,这按预期工作正常:select * from MY_TABLE UNION ALL select * from 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 出于我无法控制的原因代码。
最佳答案
您可以使用同义词所有者 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
不是普通用户,因此它需要特殊处理也许不足为奇。
关于database - 直接引用 Oracle 中的公共(public)同义词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24495356/