在用户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)。这两个概念都是为了方便数据库的使用和管理而设计的。 同义词(Synonym) 同义词是 Oracle 数据库...
Oracle Dblink and synonym(同义词) 授权 创建 以及使用
**Oracle学习总结** Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,对于初学者来说,掌握其核心概念和操作是至关重要的...同时,不断实践和总结,例如整理成"总结"文档,将加深记忆并提升问题解决能力。
### Oracle的同义词(Synonyms)总结 #### 一、引言 在数据库管理领域,Oracle是一款广泛使用的数据库管理系统。为了提高数据访问的安全性和便捷性,Oracle引入了同义词(Synonyms)这一概念。同义词可以视为对表...
在Oracle数据库系统中,"CREATE OR REPLACE SYNONYM DBFIELD_DICT" 是一条SQL语句,用于创建或替换数据库中的同义词(Synonym)。同义词是数据库对象的一个别名,它提供了一种方式来引用远程数据库对象或者隐藏实际...
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”这一错误。值得注意的是,在进行任何数据库管理操作之前,确保所有的环境变量都已正确设置是非常重要的。此外,...
`elasticsearch-analysis-dynamic-synonym-7.6.2`是一个专为ES7.6.2版本设计的动态同义词插件,旨在实现同义词的动态加载和管理,使得同义词库可以随着业务需求的变化而实时更新。 **一、动态同义词插件的作用** 1...
在Oracle中,Synonym是一种别名机制,它可以指向本地表或者通过DB Link指向远程表。这样做的好处在于简化了SQL语句的编写,并且增加了对数据库结构变化的透明性。 ##### 1. 创建 Synonym ```sql CREATE OR REPLACE...
创建同义词用`CREATE SYNONYM`,删除同义词用`DROP SYNONYM`。 6. **索引**:索引提高查询速度,基于列值。创建索引用`CREATE INDEX`,考虑索引策略避免不必要的性能开销,验证索引效果,删除索引用`DROP INDEX`。 ...
在本话题中,我们将聚焦于“ES同义词插件analysis-dynamic-synonym7.5.1版本”,它是Elasticsearch中一个增强搜索功能的重要组件。 Elasticsearch同义词插件的作用在于扩展默认的文本分析过程,允许我们在搜索时将...
为了与数据库进行交互,插件还引入了数据库驱动,如`ojdbc6-11.2.0.3.jar`用于Oracle数据库连接,以及`mysql-connector-java-8.0.21.jar`用于MySQL数据库连接。这表明插件支持从多种类型的数据库中获取和更新同义...
### 达梦与Oracle的主要差异 #### 一、字段名处理差异 在处理字段名时,达梦数据库和Oracle有着显著的区别。对于字段名的大小写敏感性问题,两者采用了不同的处理方式: - **达梦数据库**:支持字段名的大小写...
它是一个只有一行一列的系统表,属于SYS模式,并通过PUBLIC SYNONYM公开给所有用户使用。DUAL常用于测试SQL语句,特别是那些不需要从实际表中获取数据的查询。例如,当你需要验证一个简单的计算或函数结果时,可以...
### Oracle 用法总结 #### (一) 用户管理 **1. 创建用户** 在 Oracle 数据库中,创建用户是一项基本的数据库管理任务。这通常由数据库管理员执行,并且需要使用以下命令: ```sql CREATE USER user_name ...
环境变量 ORACLE_UNQNAME 未定义问题 环境变量 ORACLE_UNQNAME 未定义问题是 Oracle 数据库管理系统中常见的一种错误,该错误通常是由于环境变量 ORACLE_UNQNAME 未被正确设置所致。该环境变量用于指定 Oracle ...
- **ORACLE数据字典**:用于存储关于数据库的元数据信息。 - **表空间与数据文件**:表空间是逻辑上的概念,用于组织数据库的数据存储;数据文件则是物理上的存储单元。 - **ORACLE实例**:代表了数据库运行时的...
这就是"elasticsearch-analysis-dynamic-synonym7.8.1"插件的作用所在。 这个插件是专为Elasticsearch 7.8.1 版本设计的,它的主要功能是添加对同义词的支持。同义词插件允许用户在搜索时将多个具有相同或类似含义...