database - 直接引用 Oracle 中的公共(public)同义词

标签 database oracle schema synonym

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

的形式创建 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/

相关文章:

java - JDBC 是否将数据库 session 时区设置为 Java 虚拟机的时区?

iphone - 将 sqlite 附加到 xcode 邮件

php - 我正在尝试从数据库中调用一组结果,但无法正常工作

c# - OracleConnectionPoolManager 在其终结器中抛出异常

java - 验证 XML 是否为 DOM 文档

php - 配方/成分/测量/数量的数据库模式

enums - 枚举类型的 JAXB 元素

database - PostgreSQL 中数据类型 "Numeric"可以支持负数吗?

oracle - 从现有表创建重复表[duplicate]

sql - 递归连接计数 - Oracle