HR用户无权访问DBA_TAB_COLUMNS

时间:2019-08-10 21:14:29

标签: sql oracle

我正在研究Oracle数据库并解决审阅问题。 关于字典视图,有一个我不太了解的问题和答案:

您需要获取有关您不拥有的表中的列的信息,也无需对其拥有特权。您可以查询哪个视图以获取此信息?

这个问题的答案是:DBA_TAB_COLUMNS

我认为正确答案应该是Can’t be done

我已经与HR用户一起运行了

SELECT * FROM DBA_TAB_COLUMNS;

我有table or view does not exist,这很可能意味着HR无法访问该特定视图。在我的理解中,这是正确的行为。

能否请您解释一下为什么DBA_TAB_COLUMNS并非对所有用户都有效的正确答案?

1 个答案:

答案 0 :(得分:2)

好吧,如果您有权使用dba_tab_columns;并非每个人都这样。

特权用户(例如SYSSYSTEM)拥有数据库,因此他们可以看到它。如果您可以以这样的用户身份进行连接(不必是这两个用户中的任何一个;也可以是其他任何被授予所需特权的用户),那么您可以执行查询。

或者,如果您可以获得select特权,那就足够了。例如:

以非常有限的权限创建全新的用户:

SQL> connect sys as sysdba
Enter password:
Connected.
SQL> create user mike identified by lion
  2  default tablespace users
  3  temporary tablespace temp
  4  quota unlimited on users;

User created.

SQL> grant create session to mike;

Grant succeeded.

以新创建的用户身份连接,尝试从dba_tab_columns中进行选择:

SQL> connect mike/lion
Connected.
SQL> select count(*) from dba_tab_columns where table_name = 'DEPT';
select count(*) from dba_tab_columns where table_name = 'DEPT'
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

不起作用(按预期方式)。获取一些特权,然后重试:

SQL> connect sys as sysdba
Enter password:
Connected.
SQL> grant select on dba_tab_columns to mike;

Grant succeeded.

SQL> connect  mike/lion
Connected.
SQL> select count(*) from dba_tab_columns where table_name = 'DEPT';

  COUNT(*)
----------
         6

SQL>

现在可以了。


所以...是的,我同意你的看法-除非您有权访问dba_tab_columns,否则应该如何查询?