我正在开发在Oracle上工作的应用程序。对于某种逻辑,我需要使用指定的模式从给定的db用户获取表列表。在我的例子中,我有一个用户已经授予了对给定模式的访问权限。因此,当我的代码使用给定的凭据创建连接并尝试从以下查询中获取表时,它的返回表列表。
SELECT * FROM dba_objects where owner ='schema' and object_type = 'TABLE'
上面的查询使用的是具有授予所有特权的的用户,但是当我尝试使用有限的权限时,它将抛出错误消息。
ORA-00942: table or view does not exist
00942. 00000 - "table or view does not exist"对于正在创建连接的辅助用户,通过以下查询授予了权限
create user johnsmith identified by Passw0rd;;
grant connect to johnsmith ;
grant select any table to johnsmith ;
grant UPDATE any table to johnsmith ;
grant DELETE any table to johnsmith ;
grant INSERT any table to johnsmith ;应该授予用户对下列系统表的访问权限.?
发布于 2017-06-14 13:29:59
使用初始化参数设置为false,这是默认的,那么:
提供对其他架构中对象的访问的系统权限不允许其他用户访问
SYS架构中的对象。例如,SELECT ANY TABLE权限允许用户访问其他模式中的视图和表,但不允许用户选择字典对象(动态性能视图的基表、常规视图、包和同义词)。但是,您可以授予这些用户显式对象特权来访问SYS架构中的对象。
因此,您可以对所需的特定视图授予select特权:
grant select on sys.dba_objects to johnsmith;对于其他视图也是如此;或者,如果您需要它们拥有对SYS模式对象的更广泛访问,您可以为它们提供一个角色:
grant select_catalog_role to johnsmith;尽管应该始终应用最小特权原则,但这可能会导致过度使用,并且可能会暴露一些您不希望用户看到的东西。
您不需要为用户提供任何东西才能查询user_*视图。如果您指的是那些(例如dba_tables )的DBA等价物,那么将它们与上面的dba_objects一样授予它们;否则它们将包含在select_catalog_role中。但同样,只给予真正需要的东西。
无论哪种方式,对于dbms_metadata,您也可以对该包授予特权(不能对包中的各个过程授予特权):
grant execute on dbms_metadata to johnsmith;或者--可能比实际需要的要多得多,而且可能比选择角色更危险:
grant execute_catalog_role to johnsmithhttps://stackoverflow.com/questions/44545654
复制相似问题