2017-06-14 68 views
0

我正在研究适用于Oracle的应用程序。对于某种逻辑,我需要使用指定模式从给定数据库用户获取表的列表。就我而言,我有一个已经授予给定模式访问权限的用户。所以,当我的代码使用给定的凭据创建连接并尝试从下面的查询中获取表时,它的返回表列表。需要授予哪个权限才能访问sys.dba_systems

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 ; 

我应该授予用户权限哪家有以下系统表的访问权限授予.. 。?

  • DBA_OBJECTS
  • USER_CONSTRAINTS
  • USER_CONS_COLUMNS
  • USER_TABLES
  • all_tab_cols 并且还允许访问dbms_metadata.get_dependent_ddl()方法

回答

2

随着the O7_DICTIONARY_ACCESSIBILITY initialisation parameter set to false,这是默认的,那么:

提供对其他模式中对象的访问权限的系统权限不会让其他用户访问SYS模式中的对象。例如,SELECT ANY TABLE特权允许用户访问其他模式中的视图和表,但不允许他们选择字典对象(动态性能视图,常规视图,包和同义词的基表)。但是,您可以授予这些用户明确的对象权限以访问SYS架构中的对象。

所以,你可以授予你所需要的具体意见选择权限:

grant select on sys.dba_objects to johnsmith; 

,并同其他意见;或者如果你需要他们有wider access to the SYS schema objects你可以给他们一个角色:

grant select_catalog_role to johnsmith; 

虽然principle of least privilege应该始终适用,所以这可能是矫枉过正,并可能暴露的东西,你不希望用户能够查看。

您无需授予任何东西,以便用户能够查询user_*意见。如果你的意思是那些DBA等价物 - 例如dba_tables - 然后授予他们以上的dba_objects;或者他们将被包括在select_catalog_role中。但是,只需要授予实际需要的内容。

无论哪种方式,对于dbms_metadata你可以只授予权限上包太(你不能授予包个别程序的权限):

grant execute on dbms_metadata to johnsmith; 

或 - 可能再次远远超过实际需要,并且可能更危险的是选择角色:

grant execute_catalog_role to johnsmith 
相关问题