昨天接到一个开发的需求,内容看起来非常简单。
申请数据库192.168.1.118:1522:TEST下用户APP_TE_FLOW_128赋予对表testore_log的查询权限。。。
貌似这个语句也就几秒钟就可以搞定,直接赋予对象权限,或者角色都可以,
类似grant select on test.testore_log to APP_TE_FLOW_128;
但是这个看似简单的案例,我想用两篇日志来总结,因为里面有许多的内容量,中间的过程也是异常曲折,而且最开始的推论很可能是错误的,然后还可以上升到业务层面。
所以我会按照真实的分析思路来说这个问题,看完之后大家就会明白了。原谅我分析中的错误先。
我直接使用dba账号登录,然后直接使用alter session set current_schema=APP_TE_FLOW_128;然后触发了下面的sql语句。
sys@TEST> select count(*) from testore_log;
select count(*) from testore_log
                     *
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-02063: preceding line from GCDB
从这个错误可以看出,是使用了db link,但是访问的时候貌似没有访问到。
整个访问的流程类似下面的形式,在ip为118和128都存在一个test用户,两个test用户的数据不同,118库中的APP_TE_FLOW_128访问的一部分数据是118中的test用户,另外一部分是128总的test用户,当然是间接通过flow0这个用户以db link的形式来访问。

在118服务器端做检查
sys@TEST> select * from dba_synonyms where synonym_name=upper('testore_log');
OWNER                          SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME                     DB_LINK
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------
APP_TE_FLOW_128                testore_log                 TEST                           testore_log                 GCDB
可以看到这个同义词很明显是使用了db link为gcdb
进一步查看db link的情况,发现存在这一些和gcdb相关的db link,都是位于不同的用户下。
sys@TEST> SELECT * FROM DBA_DB_LINKS WHERE DB_LINK='GCDB';
OWNER               DB_LINK  USERNAME  HOST               CREATED
------------------- -------- --------- ------------------ ------------
PUBLIC              GCDB     TLCS0     TEST_TEST_CENTER    23-MAY-11
TEST                GCDB     TEST0     TEST_TEST_CENTER    09-JUN-10
APP_TEST_QUERY_128  GCDB     QUERY0    TEST_TEST_CENTER    09-JUN-10
APP_TE_FLOW_128     GCDB     FLOW0     TEST_TEST_CENTER    09-JUN-10
APP_TE_SDE_128      GCDB     SDE0      TEST_TEST_CENTER    02-JUL-10
然后来得到db link最终的服务信息,最终得到服务器ip即128的服务器
$ tnsping TEST_TEST_CENTER
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = TESTcenter.cyou.com)(PORT = 1525))) (CONNECT_DATA = (SERVICE_NAME = GCDB)))
$ cat /etc/hosts|grep TESTcenter.cyou.com
192.168.1.128  TESTcenter.cyou.com
好了,简单的检查完成,我们继续测试。
切换到APP_TE_FLOW_128下。
sys@TEST> alter session set current_schema=APP_TE_FLOW_128;
Session altered.
然后查看all_synonyms没有得到任何结果,这是一个疑点。
sys@TEST>  select * from all_synonyms where owner='APP_TE_FLOW_128' and synonym_name=upper('testore_log');
no rows selected
尝试得到表结构信息,竟然报错了,说明还是可以访问,只是最终访问不通。
sys@TEST> desc testore_log
ERROR:
ORA-04043: object "TEST"."testore_log" does not exist
ORA-02063: preceding line from GCDB

在128服务器端,切换到flow0这个用户
sys@GCDB> alter session set current_schema=FLOW0;
Session altered.
查看权限都没有问题,都是存在的。
sys@GCDB> SELECT * FROM DBA_TAB_PRIVS WHERE TABLE_NAME=upper('testore_log');
GRANTEE            OWNER   TABLE_NAME    GRANTOR   PRIVILEGE    GRA HIE
------------------ ------- ---------------- --------- ------------ --- ---
FLOW0              TEST    testore_log   TEST      SELECT       NO  NO
这是一个疑问,
然后下面的情况就更奇怪了。

在118服务器端,我尝试通过db link来查看gcdb中的数据表的情况。cat基本类似于user_tables
发现118的服务器中存在一个同义词。
sys@TEST> select table_name,table_type from cat@gcdb;
TABLE_NAME                     TABLE_TYPE
------------------------------ -----------
USER_POINT                     SYNONYM
然后我通过dba_synonyms去查看这个同义词,竟然又没有db link的关联,着实奇怪。
sys@TEST> select * from dba_synonyms where synonym_name='USER_POINT';
OWNER                          SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME                     DB_LINK
------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------
APP_TE_FLOW_128                USER_POINT                     TEST                           USER_POINT
为了更进一步验证,直接查看gcdb中的表user_point的rowid,也没有任何问题,如果想进一步验证,其实会发现还是在128库中的。
sys@TEST> select rowid from user_point@gcdb where rownum<2;
ROWID
------------------
AAAPNRAAHAABdzUAAw
那么这个问题就很奇怪了,看起来解释不通啊。所以这个关系理不清楚,压根没法去赋权限。
继续检查。
在128服务器端继续查看,发现确实有对应的这个表,而且赋予了基本的查询权限。
SQL>SELECT * FROM DBA_TAB_PRIVS WHERE TABLE_NAME='USER_POINT';
GRANTEE                        OWNER                          TABLE_NAME           GRANTOR                        PRIVILEGE                                GRA HIE
------------------------------ ------------------------------ -------------------- ------------------------------ ---------------------------------------- --- ---
FLOW0                          TEST                           USER_POINT           TEST                           SELECT                                   NO  NO
那么这个问题怎么解释呢,看起来确实是很费神。如果仔细查看前面的线索,其实就会发现一个public的db link其实在暗中操作。
就是最开始我们给出的检查结果。在118的库中确实存在一个public的db link为gcdb.
gc端sys@TEST> SELECT * FROM DBA_DB_LINKS WHERE DB_LINK='GCDB';
OWNER               DB_LINK  USERNAME  HOST               CREATED
------------------- -------- --------- ------------------ ------------
PUBLIC              GCDB     TLCS0     TEST_TEST_CENTER    23-MAY-11
当然我们就会发现那个用户TLCS0在128的库中也确实存在,一切手续都齐全。
sys@GCDB SELECT * FROM DBA_SYNONYMS WHERE OWNER='TLCS0';
OWNER                          SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME           DB_LINK
------------------------------ ------------------------------ ------------------------------ -------------------- ------------------------------
TLCS0                          USER_POINT                     TEST                           USER_POINT
所以大体通过这个Public的db link我们基本明白了,为什么会出现这种奇怪的现象。
那么问题来了,为什么APP_TE_FLOW_128中的db link没有起作用呢,一种很大的可能性就是这个db link有问题。
首选从dba_users中查到加密后的密码。
sys@GCDB select username,password from dba_users where username='FLOW0';
USERNAME                       PASSWORD
------------------------------ ------------------------------
FLOW0                          BCF5E83CF6EF0269
因为这个db link创建的时间确实很早了,我也压根没法得最终的密码,所以有一种看似不错的方案,那就是使用values的方式来重新创建一个db link来验证一下。这样也不用重新动原来的密码了。
CREATE DATABASE LINK APP_TE_FLOW_128.GC_NEW_LINK CONNECT TO FLOW0 IDENTIFIED BY VALUES 'BCF5E83CF6EF0269' USING 'TEST_TEST_CENTER'
自认为已经解决问题在望,但是做了一个简单的查询,马上让我有些措手不及。持续了十多秒没有反应,我感觉有些问题,马上终止,然后就收到一个600错误。
sys@TEST> select count(*)from test_20151208@APP_TE_FLOW_128.GC_NEW_LINK;
select count(*)from test_20151208@APP_TE_FLOW_128.GC_NEW_LINK
                                  *
ERROR at line 1:
ORA-00600: internal error code, arguments: [kzdlk_zt2 err], [18446744073709551603], [], [], [], [], [], []
这个问题在mos上查看了一番,发现是一个bug,对于values的方式还是存在一定的问题,也是有惊无险。
ORA-00600: [Kzdlk_zt2 Err] While Selecting Using a Database Link (Doc ID 456320.1)

所以使用values的方式创建db link不通,那么我们只能DIY,重新在128的服务器上创建一个用户,做权限分配,然后链接到118的库中。
假设128中创建的用户为flow
sys@GCDB> grant connect to flow0_new;
Grant succeeded.
然后创建了一个新的db link
sys@TEST> conn cydba/cydba
Connected.
cydba@TEST> create database link flow0_128 connect to flow0_new identified by flow0_new using 'TEST_TEST_CENTER';
Database link created.
但是访问有些问题
select count(*) from test_20151208@flow0_128

就马上调整为了public 的db link
 create public database link flow0_128 connect to flow0_new identified by flow0_new using 'TEST_TEST_CENTER';
 然后再次验证。这次就没有问题了。
 alter session set current_schema=APP_TE_FLOW_128;
 cydba@TEST> select count(*)from TEST.testore_log@flow0_128 where rownum<2;
  COUNT(*)
----------
         1
这个过程的问题明天再来解读。

关于db link权限分配的苦旅(一)相关推荐

  1. oracle数据库link格式,Oracle创设DB Link

    当前位置:我的异常网» 数据库 » Oracle创设DB Link Oracle创设DB Link www.myexceptions.net  网友分享于:2013-08-26  浏览:4次 Orac ...

  2. mysql用户的权限分配

    2019独角兽企业重金招聘Python工程师标准>>> 因今天在分配数据库权限的时候,同事反映账户不能使用函数,遂搜集资料总结了一番关于mysql用户的权限分配. MySQL 赋予用 ...

  3. blob没权限 ie_vuerouter 源码和动态路由权限分配

    本文首发于政采云前端团队博客:浅析 vue-router 源码和动态路由权限分配https://www.zoo.team/article/vue-router-analysis 背景 上月立过一个 f ...

  4. 突出重围:Oracle 10.2.0.5应用SCN补丁解决DB Link预警实践

    点击▲关注 "数据和云"   给公众号标星置顶 更多精彩 第一时间直达 作者:赵靖宇,云和恩墨北区交付工程师,长期服务于运营商.保险.医院.政府等行业,擅长Oracle数据库故障处 ...

  5. db link的查看创建与删除

    --db link的查看创建与删除 ----------------------------2013/10/30 1.查看dblink select owner,object_name from db ...

  6. 【SSH框架/国际物流商综平台】-05 单点登录 用户-角色-权限分配 Ztree.js structs2.0 异常框架 细粒度权限控制 BaseEntitity中createby degree

    回顾 Shiro安全框架 认证,授权,加密,会话管理(单点登录),缓存,与web集成 单点登录(SSO Single Sign on)的原理 就是将原有的各个系统的会话管理机制,抽取出来交给第三方集中 ...

  7. vue-router 源码和动态路由权限分配

    本文首发于政采云前端团队博客:浅析 vue-router 源码和动态路由权限分配https://www.zoo.team/article/vue-router-analysis 背景 上月立过一个 f ...

  8. Web应用——驾培管理系统之系统—权限分配(作者:小圣)

    Web应用--驾培管理系统之系统-权限分配(作者:小圣) 本节博文将向大家介绍本次Web应用之权限分配. 笔者会把大概实现过程贴出来,有看不懂过程且需要项目源码的请戳:http://download. ...

  9. FineReport——权限分配以及自定义首页

    权限分配可以有两种方法,第一种方法是根据部门职位分配权限,第二种是根据角色分配权限: FR自带有三个JQ对象,用以保存用户名参数/角色参数/部门参数--$fr_username/$fr_authori ...

最新文章

  1. 关于Windows 2003下开启防火墙后不能通过FTP问题解决
  2. python 扑克牌中的顺子
  3. Oracle编程入门经典 第8章 索引
  4. java.lang.NullPointerException 空指针异常问题
  5. 一步步实现:springbean的生命周期测试代码
  6. linux点阵ascii像素字体,点阵字体显示系列之一:ASCII码字库的显示 | 迟思堂工作室...
  7. 贫穷中透着零基础的单人制作游戏手册之一:怎么开局
  8. 【HTTP】get 和 post 两种基本请求方法
  9. 什么是SAP CRM里的Sales Bundle?
  10. vscode 设置缩进为4_VS Code 设置缩进为4个空格
  11. SpringBoot安装和创建简单的Web应用
  12. id3决策树 鸢尾花 python_机器学习之分类回归树(python实现CART)
  13. 中国邮路问题邮递员问题欧拉路径图论C++
  14. [转] 39万的一节课:让你悟透“近朱者赤,近墨者黑”的道理
  15. 网络基础-应用层:E-mail应用:SMTP协议,POP协议,IMAP协议
  16. python微信公众号生成专属二维码--你再也不用去求人了
  17. Scikit-learn API:train_test_split函数 将数据分割为训练集和测试集
  18. matlab离群值算法_什么是离群值如何检测和删除它们对离群值敏感的算法
  19. UEFI与 Legacy BIOS两种启动模式详解
  20. 学计算机投影仪定义,一种计算机教学用投影仪射头的制作方法

热门文章

  1. 志愿填报显示服务器错误,高分落榜案例:志愿填报常见的3个低级错误
  2. android gis 框架,三、ArcGis For Android:图层(Layers)
  3. 3GPP Release、TSG、RAN等概念介绍
  4. 数据挖掘工具weka使用
  5. Java Process.exitValue Process.waitFor()
  6. 如何在JAVA程序中使用Struct一次传入多条数据给Oracle的存储过程
  7. 公司行为(Corporate Actions)
  8. maven2——设置镜像篇
  9. ORACLE的所有字段类型
  10. Oracle SQL Developer中进行存储过程调试