Oracle中如何让其他Schema访问视图?授权后遇ORA-00942错误
解决ORA-00942: table or view does not exist的问题
这个问题我之前处理过,根源是对象的Schema可见性导致的——你虽然给了other_user视图的SELECT权限,但other_user登录后默认只会查找自己Schema下的对象,而视图是创建在admin的Schema里的,所以才会报找不到的错误。下面是两种可行的解决方法:
方法1:访问时显式指定Schema前缀
当other_user登录后,执行查询时加上视图所在的Schema名称,明确告诉数据库要找哪个Schema下的视图:
SELECT color, quantity FROM admin.new_product_view;
方法2:创建同义词(推荐,更便捷)
如果不想每次查询都手动加Schema前缀,可以创建同义词,让other_user直接通过视图名访问:
私有同义词(仅other_user可用)
切换回admin用户,执行以下语句,给other_user的Schema创建私有同义词:
CREATE SYNONYM other_user.new_product_view FOR admin.new_product_view;
之后other_user登录后,直接执行SELECT * FROM new_product_view;就能正常访问视图了。
公共同义词(所有有权限的用户都可用)
如果后续有多个用户需要访问这个视图,可以创建公共同义词,让所有拥有权限的用户都能直接用视图名访问:
CREATE PUBLIC SYNONYM new_product_view FOR admin.new_product_view;
额外验证:确认权限已正确授予
为了确保权限没有遗漏,admin用户可以执行以下查询,验证other_user的SELECT权限是否生效:
SELECT grantee, privilege, table_name FROM user_tab_privs WHERE table_name = 'NEW_PRODUCT_VIEW' AND grantee = 'OTHER_USER';
如果结果里能看到OTHER_USER对应的SELECT权限,说明权限授予是没问题的,只需要解决可见性问题即可。
内容的提问来源于stack exchange,提问作者user3153014




