设为首页 收藏本站
查看: 957|回复: 0

[经验分享] 关于oracle synonym 的总结整理

[复制链接]

尚未签到

发表于 2016-8-11 06:32:07 | 显示全部楼层 |阅读模式
  在用户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的同义词,这样会造成很多隐晦的问题,除非不得以才要建。哪个用户需要,就在哪个用户下创建本用户下的同义词,这样比较清晰。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-255931-1-1.html 上篇帖子: oracle命令导出dmp文件 下篇帖子: 新手学java(10)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表