2

我正在开发适用于 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 ;

我应该授予用户哪些权限以访问以下系统表...?

  • dba_objects
  • 用户约束
  • user_cons_columns
  • USER_TABLES
  • all_tab_cols 并且还允许访问 dbms_metadata.get_dependent_ddl() 方法
4

1 回答 1

5

将初始化参数设置O7_DICTIONARY_ACCESSIBILITYfalse,这是默认值,然后:

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

因此,您可以授予对所需特定视图的选择权限:

grant select on sys.dba_objects to johnsmith;

其他视图也一样;或者,如果您需要他们更广泛地访问 SYS 模式对象,您可以给他们一个角色:

grant select_catalog_role to johnsmith;

尽管应始终应用最小特权原则,但这样做可能有点矫枉过正,并且可能会暴露您不希望该用户看到的内容。

您无需为用户授予任何权限即可查询user_*视图。如果您的意思是那些的 DBA 等价物 - 例如dba_tables- 然后按上述方式授予它们dba_objects;否则它们将被包含在select_catalog_role. 但同样,只授予实际需要的东西。

无论哪种方式,因为dbms_metadata您也可以授予该包的权限(您不能授予包中单个过程的权限):

grant execute on dbms_metadata to johnsmith;

或者 - 可能比实际需要的要多得多,并且可能比 select 角色更危险:

grant execute_catalog_role to johnsmith
于 2017-06-14T13:29:59.887 回答