当前用户访问非本用户模式
如果当前用户查询自己用户模式下的对象时,是不需要额外授权的,但是如果要查询其他模式下的对象信息,比如表,就需要 select any table
权限
如果需要查询一些系统表信息,例如 dba_objects
,就需要 select_catalog_role
权限
同样的,如果需要在自己的模式下创建对象,就只需要 create
权限就可以了,而不是 create any
权限,比如创建表,在自己的模式下创建表只需要 creat table
,而在其他模式下创建表就需要 create any table
权限
user_objects
、all_objects
和 dba_objects
有什么区别
现在有一个场景,需要查询某个模式下(非本用户模式)下的函数的信息,我们考虑在 all_objects
中查询时,查询不到任何信息,用户拥有的权限如下:
resource
connect
select any table
select any sequence
select any dictionary
select_catalog_role
然后我们去 dba_objects
中查询发现可以查询到信息。问题来了,dba_objects
和 all_objects
有什么区别,为什么 dba_objects
中能查询到,在 all_objects
中却查不到
在 Oracle 数据库中,
DBA_OBJECTS
和ALL_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
提供了当前用户可访问到的对象的局部信息。具体使用哪个视图取决于您需要查询的对象的范围和您的权限级别。
综上所述
dba_objects
:显示的整个实例中的对象,能否查看取决于数据库用户的权限。user_objects
:只显示当前用户拥有的所有对象,其他的用户和系统的对象不显示。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,最终发现,是因为授权的角色权限还没有生效,导致还是没有权限去查询,通过以下几种方式刷新授权:
使用
alter session
命令:对于当前会话,可以使用alter session set current_user = username
,然后grant
或revoke
权限,这会在当前会话结束时生效。重新连接
重启实例