1.标题就是应用那边的报错,沟通得知是这条sql在dg备库上查询报的错:
SELECT a.SYSTEM_TRX_TIME
FROM qpos_r.a, qpos_r.b
WHERE a.BANK_CHANNEL_CODE = b.bank_code
and a.STATUS = '10C'
and a.ORDER_TYPE = '1'
and b.channel_name = '北京全渠道'
and a.SYSTEM_TRX_TIME >= to_date('20160202', 'yyyymmdd')
and a.SYSTEM_TRX_TIME < to_date('20160210', 'yyyymmdd')
2.第一反应肯定看见ORA-04045有什么对象无效了,因为我这边dba权限查询都是可以的,ORA-16000 是备库被select之外的操作,和开发讲明。剩下的是ORA-04045
3.和开发沟通是哪个用户
4.查询dba_objects发现开发说的那个用户下a对象无效,这个对象类型是一个同义词synonyms,于是想到是前一晚将这个普通的订单表转换为分区表导致同义词无效。
5.ALTER SYNONYM 用户.同义词名字 COMPILE;重新编译同义词成功
6.查询无效对象已经没了
7.再次让应用那边运行代码,依然失败。对象不存在。
8.删除重建同义词,确实这个同义词是这个用户的所有者,dba权限用户.同义词可以查询到值。应用再次尝试报错对象不存在
9.几经折腾给表grant select on hkrt_pos_order_payment to public;没有给权限!
10.成功。
相关sql:
drop 【public】 synonym 同义词名字;--删除同义词
create 【public】synonym a_r.a for a.a; --创建同义词
查询同义词:
select * from user_synonyms where synonym_name=upper('hkrt_pos_order_payment');
查对象,可以看到表的同义词,分区,普通表信息:
select * from dba_objects where object_name=upper('hkrt_pos_order_payment');
友情提醒:普通表做分区,要看看数据库里面的同义词!触发器等
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30536096/viewspace-2062708/
,如需转载,请注明出处,否则将追究法律责任。