我正在开发适用于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 ;
我应该授予哪些权限以允许用户访问以下系统表...?
答案 0 :(得分:4)
使用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