【问题标题】:Query table with no grant?查询没有授权的表?
【发布时间】:2018-12-10 11:53:09
【问题描述】:

如果我在用户 A 中创建表。

如果我没有给它任何权限,用户 B 如何查询该表?

在该代码中,我正在从名为“DBA_MAINT”的 DBA 用户创建表 general.privs_test。

之后,我切换到另一个用户并尝试查询该表。

也不例外,即使那张桌子上没有授权。

SQL> select user from dual;

USER
------------------------------
DBA_MAINT

SQL> create table general.privs_test(id number);

Table created.

SQL> conn dp99712a
Enter password:
Connected.
SQL> select user from dual;

USER
------------------------------
DP99712A

SQL> select * from general.privs_test;

no rows selected

SQL> desc all_tab_privs;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 GRANTOR                                   NOT NULL VARCHAR2(30)
 GRANTEE                                   NOT NULL VARCHAR2(30)
 TABLE_SCHEMA                              NOT NULL VARCHAR2(30)
 TABLE_NAME                                NOT NULL VARCHAR2(30)
 PRIVILEGE                                 NOT NULL VARCHAR2(40)
 GRANTABLE                                          VARCHAR2(3)
 HIERARCHY                                          VARCHAR2(3)

SQL> select grantee,table_schema,table_name,privilege, grantable from all_tab_pr
ivs where table_name = 'PRIVS_TEST';

no rows selected

我的版本是 ORacle 11g。

【问题讨论】:

  • 用户已授予select any table 角色?或者授权是通过角色完成的。检查user_role_privsuser_sys_privs
  • 查看USER_ROLE_PRIVSUSER_SYS_PRIVSUSER_TAB_PRIVS的视图

标签: sql oracle oracle11g privileges


【解决方案1】:

由于表是新创建的,没有任何权限,用户 dp99712a 必须具有系统权限才能查看他/她的所有表。此权限称为SELECT ANY TABLE,通常授予角色DBA

要了解是否是这种情况,请以用户 dp99712a 的身份连接并查询:

SELECT * FROM session_privs WHERE PRIVILEGE = 'SELECT ANY TABLE';

要找出所有拥有此权限的用户和角色,您可以使用:

SELECT DISTINCT grantee
  FROM dba_sys_privs 
 WHERE PRIVILEGE LIKE 'SELECT ANY TABLE%' ORDER BY 1;

【讨论】:

    猜你喜欢
    • 2011-11-12
    • 2015-02-14
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2019-02-20
    • 2019-12-02
    • 2013-05-12
    • 2017-03-15
    相关资源
    最近更新 更多