oracle刷同义词报错,oracle 同义词

今天又是被业务催命似的催着改bug,咋一看很简单,ora-00942:表或视图不存在。要么是表名被改了,要么就是sql语句写错了呗。但抱着对同事的专业精神的信(shi)任(wang),我还是去问了一下同事,老铁,帮我看一下这个表是哪张表呗,然后坐等他跟我承认他改了表。可是结果,那张表存在的!只不过属于另一个用户。然后请教了同事,原来不同的用户之间可以通过同义词来互相访问各自的表,但是仅仅了解了这个还不够,bug依然存在。接下来需要更多的步骤来查明,解决这个问题。

问题一:什么是同义词,作用又是什么?

从网上抄来的定义:同义词是数据库方案对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。在使用同义词时,Oracle数据库将它翻译成对应方案对象的名字。

说白了,就是别名的意思,和视图的功能类似,就是一种映射关系.关于同义词的更多详细信息可以百度一下,在这里就不赘述了。

基本用法:

create [public] synonym 同义词名称 for [username.]objectName;

[public]属于可选项,如果加上了就是公有同义词,没加就是私有同义词。

一般创建的时候都不写public ,也就是私有同义词,拥有者可以通过授权来控制其他用户对表的相关操作:如增删改查。

那么问题就来了,现在我查询这张表时发现无法找到这张表,说明了要么这张表他根本就没有创建同义词,要么就是该用户没权限,究竟属于哪种情况需要排查。

2.如何查看已经创建的同义词?

第一种方案非常简单粗暴,就是再建一个呗,因为同义词对象的名称也是不能重复的,如果创建不成功,就是说明已经存在该同义词了,但不推荐这种方案,太低级了,一定有相关的语句可以查看该用户下的同义词的。

所以,第二种方案:select * from all_objects where object_name=upper('A');

这个语句的意思是查找某个名为A的数据库对象,这里要注意一下红色的地方,因为貌似命名对大小写敏感,不加这个upper就没法查出来,同义词的命名为了便于记忆,一般和表名取的一样。所以可以直接通过表名来查找同义词。

其次,这个all_objects是数据库自带的,它和DBA_OBJECTS  / USER_OBJECTS一样,是数据库的视图,只不过,只有dba权限的用户(如system),才能查看DBA_OBJECTS ,否则会报表或视图不存在。而USER_OBJECTS表示的是查询当前用户的数据库视图。

好了,执行一下语句,我发现了有两个数据库对象都是叫这个A名字的,正好一张是表,一张是同义词,那既然有了同义词,为什么会报“表或视图不存在”呢?因为光创建了同义词没用,还需要对其他用户授予相应的权限才能做操作呀。

3.如何给其他用户授予权限?

很简单,语法如下,

GRANTprivilege [, ...] ON object [, ...]    TO { PUBLIC | GROUP group | username }

嗯。。。看起来很复杂,其实很简单,比如我有个用户a,a有个表A,然后还有个用户b,想要访问用户a的表A,那么我们刚刚创建了同义词A,就可以这么写:

grant select on A to b ;

注意,是在登录用户a的情况下执行这句sql,因为同义词是a的,当然得由a来说得算。

这里我只有给一个用户b赋予了查的权限,如果要给多个用户,更多的同义词赋予更多的权限,可以使用逗号分隔,如:

grant select , update,delete,insert on A,B to b ,c;

如果你不放心,可以查询一下究竟有没有授权成功:

select * from user_tab_privswhere ......

这里的user_tab_privs依旧是一张视图,可以查看相应的用户对某张表的权限。

这里顺便讲一下分库查询,因为目前我们讲的都是同一个数据库下不同用户的权限。那其实在实际项目中,还有分布式数据库。或者还有一种情况是本地数据库访问远端数据库。那么又该如何访问呢?这里需要用到数据库连接即dblink。

4.dblink

可以参考其他人的博客:https://www.cnblogs.com/wangyong/p/6354528.html

http://blog.itpub.net/24104981/viewspace-1116085/

因为我也没有实际操作过,只是在解决问题的时候顺便了解到还有这样的技术存在,有兴趣的可以尝试搜索一下,万一以后碰到了,不至于像今天一样,无从下手,要有目的地解决问题,听到一句话说,勤奋不是马不停蹄,而是有效的利用时间,努力也不是一味的埋头苦干,而是利用智慧去解决问题,否则,在这个行业做十年,也只不过是一年的工作经验重复10遍而已。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值