当前用户访问非本用户模式

如果当前用户查询自己用户模式下的对象时,是不需要额外授权的,但是如果要查询其他模式下的对象信息,比如表,就需要 select any table 权限

如果需要查询一些系统表信息,例如 dba_objects,就需要 select_catalog_role 权限

同样的,如果需要在自己的模式下创建对象,就只需要 create 权限就可以了,而不是 create any 权限,比如创建表,在自己的模式下创建表只需要 creat table,而在其他模式下创建表就需要 create any table 权限

user_objectsall_objectsdba_objects 有什么区别

现在有一个场景,需要查询某个模式下(非本用户模式)下的函数的信息,我们考虑在 all_objects 中查询时,查询不到任何信息,用户拥有的权限如下:

resource
connect
select any table
select any sequence
select any dictionary
select_catalog_role

然后我们去 dba_objects 中查询发现可以查询到信息。问题来了,dba_objectsall_objects 有什么区别,为什么 dba_objects 中能查询到,在 all_objects 中却查不到

在 Oracle 数据库中,DBA_OBJECTSALL_OBJECTS 是两个不同的数据字典视图,用于查看数据库中的对象信息。它们之间的主要区别在于用户能够访问的范围和显示的对象数量。

  • DBA_OBJECTS

    • DBA_OBJECTS 视图包含了数据库中所有对象的信息,无论是当前用户的还是其他用户的。只有具有 DBA 权限或者被授予了 SELECT_CATALOG_ROLE 角色的用户才能访问这个视图。

    • DBA_OBJECTS 视图显示了所有用户的对象,包括表、视图、函数、存储过程等。它提供了全局的对象信息。

    • DBA_OBJECTS 视图中的信息更加详细,包括 OWNER(对象所有者)、OBJECT_NAME(对象名称)、OBJECT_TYPE(对象类型)等。

  • ALL_OBJECTS

    • ALL_OBJECTS 视图只包含了当前用户有权限访问的对象的信息,包括当前用户拥有的对象以及被授予了访问权限的其他用户的对象。普通用户和具有 DBA 权限的用户都可以访问这个视图。

    • ALL_OBJECTS 视图显示了当前用户可以访问到的对象,但不包括所有用户的对象信息。它提供了当前用户的对象视图。

    • ALL_OBJECTS 视图中的信息相对较少,通常只包括 OWNER(对象所有者)、OBJECT_NAME(对象名称)、OBJECT_TYPE(对象类型)等基本信息。

总的来说,DBA_OBJECTS 提供了数据库中所有对象的全局信息,而 ALL_OBJECTS 提供了当前用户可访问到的对象的局部信息。具体使用哪个视图取决于您需要查询的对象的范围和您的权限级别。

综上所述

  1. dba_objects:显示的整个实例中的对象,能否查看取决于数据库用户的权限。

  2. user_objects:只显示当前用户拥有的所有对象,其他的用户和系统的对象不显示。

  3. all_objects:显示当前用户可以访问的所有对象,包含用户拥有的对象。

也就是说,all_objects 显示的是当前用户可以访问的对象,那怎么样让函数可以访问呢,授予 execute any procedure 权限不就好了,授予后,就可以在 all_objects 中查询到函数的信息了

授权了 select_catalog_role 角色,还是获取不了对象 DDL

我是用 C##CLEAR 用户连接数据库,该用户所具有的权限如下:

resource
connect
select any table
select any sequence
select any dictionary

现在我想使用该用户获取 C##CDW 用户下的函数 CASE_FUN 的 DDL 语句,于是我执行了下面这条 SQL

select DBMS_METADATA.GET_DDL('FUNCTION', 'CASE_FUN', 'C##CDW') from DUAL

执行该语句报错如下:

于是我授予 C##CLEAR 用户 select_catalog_role 角色

grant select_catalog_role to "C##CLEAR";

然后我再去获取 CASE_FUN 的 DDL,发现还是会报错,那么问题来了?为什么授权了 select_catalog_role 角色,还是获取不了对象 ddl,最终发现,是因为授权的角色权限还没有生效,导致还是没有权限去查询,通过以下几种方式刷新授权:

  1. 使用 alter session 命令:对于当前会话,可以使用 alter session set current_user = username,然后 grantrevoke 权限,这会在当前会话结束时生效。

  2. 重新连接

  3. 重启实例