使用Toad在Oracle创建视图提示表或视图不存在,单独查询正常,原因是什么?
这问题我之前帮同事排查过好几次,结合你给出的视图创建语句,大概率是这几个原因,你可以逐个排查:
1. BEQUEATH DEFINER 引发的权限差异
你用了BEQUEATH DEFINER子句,这意味着视图执行时会使用创建者(MGR用户)的权限,而你单独运行查询语句时,用的是当前登录用户的权限。
你单独查能成功,说明你当前用户有访问MIS_PERMAL.MV_INDEX_PERFORMANCE的权限,但MGR用户很可能没有!
验证方法:切换到MGR用户,直接执行视图里的SELECT语句,如果报错"Table or view doesn't exist",那实锤就是权限问题。
解决办法:给MGR用户授予基表的查询权限:
GRANT SELECT ON MIS_PERMAL.MV_INDEX_PERFORMANCE TO MGR;
2. FORCE选项的误导
你加了FORCE关键字,它的作用是强行创建视图,哪怕依赖对象不存在或权限不足,但创建后的视图状态是INVALID(无效),执行时照样报错。
不过你是创建视图时就报错,说明FORCE也绕不开权限问题——它只能忽略依赖的“存在性”检查,但权限不够还是会报错。所以别依赖FORCE来解决根本问题。
3. 列名双引号的潜在问题(可能性较低)
你的SELECT语句里给列名加了双引号(比如"INDEX_ID"),Oracle中双引号会强制区分大小写。如果基表MIS_PERMAL.MV_INDEX_PERFORMANCE的列名是用双引号创建的非大写(比如小写index_id),那你这么写是对的;但如果列名是Oracle默认的大写,其实不用双引号也能正常访问。
不过你单独查询能成功,说明这个不是导致“表或视图不存在”的原因,只是个小细节提醒。
4. ORDER BY列未包含在SELECT中的问题(非当前报错原因,但建议修正)
你的视图定义里用了order by INDEX_ID, price_date desc,但SELECT列表里没有price_date列。Oracle对视图中的ORDER BY有严格要求:要么把排序列包含在SELECT中,要么结合ROWNUM/FETCH FIRST来使用,否则可能导致视图后续执行异常。
虽然这不是当前报错的原因,但建议把price_date加到SELECT列表里,或者去掉视图里的ORDER BY(毕竟视图本身的排序意义不大,查询视图时再排序更灵活)。
内容的提问来源于stack exchange,提问作者Tom

