`

关于oracle synonym 的总结整理

 
阅读更多

在用户codprov用户下,创建了两个同义词,一个是public的,一个是本用户下的,但是同义词的名称一样,codprov用户有查询cod用户下所有对象的权限。

create or replace public synonym TB_OFR_CUST_REP_DETAIL for COD.VW_OFR_CUST_REP_DETAIL;
create or replace synonym codprov.TB_OFR_CUST_REP_DETAIL for COD.TB_OFR_CUST_REP_DETAIL;

COD.VW_OFR_CUST_REP_DETAIL的内容如下:
CREATE OR REPLACE VIEW COD.VW_OFR_CUST_REP_DETAIL AS
SELECT rd.DISC_RULE_ID DISC_RULE_ID,
       rd.STAT_SECT_ID STAT_SECT_ID,
       rd.MONEY_ITEM MONEY_ITEM,
       rd.MONEY_CLAC_TYPE MONEY_CLAC_TYPE,
       rd.DISC_COUNT DISC_COUNT
  FROM MV_OFR_CUST_REP_PRI rp,
       MV_OFR_CUST_REP_DETAIL rd
 WHERE rp.DISC_RULE_ID = rd.DISC_RULE_ID
   AND rp.MONEY_TYPE = '2'
UNION
SELECT rd.DISC_RULE_ID DISC_RULE_ID,
       'A' || rd.DISC_RULE_ID || '_9999' STAT_SECT_ID,
       rd.MONEY_ITEM MONEY_ITEM,
       rd.MONEY_CLAC_TYPE MONEY_CLAC_TYPE,
       rd.DISC_COUNT DISC_COUNT
  FROM MV_OFR_CUST_REP_PRI rp,
       MV_OFR_CUST_REP_DETAIL rd
 WHERE rp.DISC_RULE_ID = rd.DISC_RULE_ID
   AND rp.MONEY_TYPE = '1';
问题:
查询:select * from tb_ofr_cust_rep_detail;能得出如下结果:
DISC_RULE_ID STAT_SECT_ID MONEY_ITEM MONEY_CLAC_TYPE DISC_COUNT
1 A1_9999 1 1 .02
1 A1_9999 2 2 10
1 A1_9999 3 2 0
1 A1_9999 4 2 15
10016 A10016_9999 1 1 .02


查询:SELECT * FROM CODPROV.TB_OFR_CUST_REP_DETAIL;也得出如下结果:
DISC_RULE_ID STAT_SECT_ID MONEY_ITEM MONEY_CLAC_TYPE DISC_COUNT
1 A1_9999 1 1 .02
1 A1_9999 2 2 10
1 A1_9999 3 2 0
1 A1_9999 4 2 15
10016 A10016_9999 1 1 .02

可是查询:select * from cod.tb_ofr_cust_rep_detail;却报错ORA-00942:表和视图不存在,而查询同义词SELECT * FROM CODPROV.TB_OFR_CUST_REP_DETAIL时却没有报ORA-00980同义词转换不再有效的错误。是为什么?

经过分析,发现tb_ofr_cust_rep_detail在cod下确实不存在,因此查询:select * from cod.tb_ofr_cust_rep_detail报ORA-00942:表和视图不存在是必然的,而SELECT * FROM CODPROV.TB_OFR_CUST_REP_DETAIL时却没有报ORA-00980同义词转换不再有效的错误,那是因为这个用户下创建了一个 public的同义词,在codprov用户下创建私有的同义词:create or replace synonym codprov.TB_OFR_CUST_REP_DETAIL for COD.TB_OFR_CUST_REP_DETAIL时;映射的COD.TB_OFR_CUST_REP_DETAIL实际上是先前创建的public 同义词,而他们的名称正好一致,所有给人以错觉,以为他引用的还是cod.tb_ofr_cust_rep_detail的表。如果不创建这个 public同义词,那么查询SELECT * FROM CODPROV.TB_OFR_CUST_REP_DETAIL必定会报ORA-00980同义词转换不再有效的错误。或者说创建的PUBLIC同义词名 称如果和创建私有同义词说映射的对象的名称不一样时,那么查询私有同义词时也会报ORA-00980错误。    --这个问题得到解释。

 

这里顺便说一下:

1.如果在某一个用户下,创建了一个PUBLIC同义词,如果查询不带用户名查询是不会报表或视图不存在的错误,如果带上用户名查询会则报ORA-00942表或视图错误,因为这个用户下确实没有这个对象。

2.如果再在这个用户下创建一个同名的对象,表、视图或者同义词,那么不管带不带用户名查询,他都会查询这个用户私有的对象,不会查询那个public的同义词,这一点特别要注意,如果在生产环境中,可能会造成很大的数据错误。

最后的总结是,一般情况下尽量避免创建public的同义词,这样会造成很多隐晦的问题,除非不得以才要建。哪个用户需要,就在哪个用户下创建本用户下的同义词,这样比较清晰。

分享到:
评论

相关推荐

    Oracle数据库 Synonym和DBLink

    Oracle 数据库 Synonym 和 DBLink Oracle 数据库中有两个重要的概念:同义词(Synonym)和数据库连接(DBLink)。这两个概念都是为了方便数据库的使用和管理而设计的。 同义词(Synonym) 同义词是 Oracle 数据库...

    Oracle Dblink and synonym(同义词)

    Oracle Dblink and synonym(同义词) 授权 创建 以及使用

    oracle学习总结

    **Oracle学习总结** Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,对于初学者来说,掌握其核心概念和操作是至关重要的...同时,不断实践和总结,例如整理成"总结"文档,将加深记忆并提升问题解决能力。

    Oracle的同义词(synonyms)总结

    ### Oracle的同义词(Synonyms)总结 #### 一、引言 在数据库管理领域,Oracle是一款广泛使用的数据库管理系统。为了提高数据访问的安全性和便捷性,Oracle引入了同义词(Synonyms)这一概念。同义词可以视为对表...

    create or replace synonym DBFIELD_DICT

    在Oracle数据库系统中,"CREATE OR REPLACE SYNONYM DBFIELD_DICT" 是一条SQL语句,用于创建或替换数据库中的同义词(Synonym)。同义词是数据库对象的一个别名,它提供了一种方式来引用远程数据库对象或者隐藏实际...

    oracle基础教程

    1.3.6 同义词(Synonym) 19 1.3.7 序列(Sequence) 19 1.3.8 数据库链(Database Link) 20 第2章 管理ORACLE数据库 21 2.1 基本概念 21 2.1.1 数据字典 21 2.1.2 事务管理 23 2.1.3 数据库管理员(DBA) 24 2.1.4 ...

    Environment variable ORACLE_UNQNAME not defined错误解决

    #### 五、总结 通过以上步骤,可以有效地解决“Environment variable ORACLE_UNQNAME not defined”这一错误。值得注意的是,在进行任何数据库管理操作之前,确保所有的环境变量都已正确设置是非常重要的。此外,...

    elasticsearch-analysis-dynamic-synonym-7.6.2

    `elasticsearch-analysis-dynamic-synonym-7.6.2`是一个专为ES7.6.2版本设计的动态同义词插件,旨在实现同义词的动态加载和管理,使得同义词库可以随着业务需求的变化而实时更新。 **一、动态同义词插件的作用** 1...

    DB Link oracle数据库数据交换

    在Oracle中,Synonym是一种别名机制,它可以指向本地表或者通过DB Link指向远程表。这样做的好处在于简化了SQL语句的编写,并且增加了对数据库结构变化的透明性。 ##### 1. 创建 Synonym ```sql CREATE OR REPLACE...

    Oracle知识整理.doc

    创建同义词用`CREATE SYNONYM`,删除同义词用`DROP SYNONYM`。 6. **索引**:索引提高查询速度,基于列值。创建索引用`CREATE INDEX`,考虑索引策略避免不必要的性能开销,验证索引效果,删除索引用`DROP INDEX`。 ...

    ES同义词插件 analysis-dynamic-synonym7.5.1版本

    在本话题中,我们将聚焦于“ES同义词插件analysis-dynamic-synonym7.5.1版本”,它是Elasticsearch中一个增强搜索功能的重要组件。 Elasticsearch同义词插件的作用在于扩展默认的文本分析过程,允许我们在搜索时将...

    elasticsearch-analysis-dynamic-synonym-7.2.0

    为了与数据库进行交互,插件还引入了数据库驱动,如`ojdbc6-11.2.0.3.jar`用于Oracle数据库连接,以及`mysql-connector-java-8.0.21.jar`用于MySQL数据库连接。这表明插件支持从多种类型的数据库中获取和更新同义...

    达梦和oracle的差异说明

    ### 达梦与Oracle的主要差异 #### 一、字段名处理差异 在处理字段名时,达梦数据库和Oracle有着显著的区别。对于字段名的大小写敏感性问题,两者采用了不同的处理方式: - **达梦数据库**:支持字段名的大小写...

    关于Oracle课程小结.docx

    它是一个只有一行一列的系统表,属于SYS模式,并通过PUBLIC SYNONYM公开给所有用户使用。DUAL常用于测试SQL语句,特别是那些不需要从实际表中获取数据的查询。例如,当你需要验证一个简单的计算或函数结果时,可以...

    Oracle 用法总结

    ### Oracle 用法总结 #### (一) 用户管理 **1. 创建用户** 在 Oracle 数据库中,创建用户是一项基本的数据库管理任务。这通常由数据库管理员执行,并且需要使用以下命令: ```sql CREATE USER user_name ...

    环境变量ORACLE_UNQNAME未定义问题

    环境变量 ORACLE_UNQNAME 未定义问题 环境变量 ORACLE_UNQNAME 未定义问题是 Oracle 数据库管理系统中常见的一种错误,该错误通常是由于环境变量 ORACLE_UNQNAME 未被正确设置所致。该环境变量用于指定 Oracle ...

    Oracle 9i10g 数据库管理详细

    - **ORACLE数据字典**:用于存储关于数据库的元数据信息。 - **表空间与数据文件**:表空间是逻辑上的概念,用于组织数据库的数据存储;数据文件则是物理上的存储单元。 - **ORACLE实例**:代表了数据库运行时的...

    elasticsearch-analysis-dynamic-synonym7.8.1

    这就是"elasticsearch-analysis-dynamic-synonym7.8.1"插件的作用所在。 这个插件是专为Elasticsearch 7.8.1 版本设计的,它的主要功能是添加对同义词的支持。同义词插件允许用户在搜索时将多个具有相同或类似含义...

Global site tag (gtag.js) - Google Analytics