Oracle DB - 如何跨架构/所有者显示权限?

时间:2010-08-26 08:10:27

标签: database oracle privileges

我在DB中拥有所有者A和所有者B.它们每个都有自己的模式等。如果我从B向用户授予权限(因此他可以访问A下的某个视图),有没有办法显示这样的权限?我的意思是,一个用户在每个数据库所有者及其示意图下拥有一些权限。 原因是我需要确保B下的任何用户都无法访问A下的任何对象。 非常感谢你

编辑:更清晰的问题:

Sceham owner A               Schema owner B
Table X                      Table CC
Table Y                      Table DD
View Z                       View EE

现在说用户John可以访问所有者A下的模式,也可以访问Oracle所有者B拥有的模式下的一个视图。我如何列出他在模式中的权限?

3 个答案:

答案 0 :(得分:1)

您需要使用其中一个DBA视图来执行此操作。

select privilege
       , table_name 
from dba_tab_privs
where grantee = 'B'
and owner = 'A'
/

如果您使用角色,那么您可能还需要检查:

select r.granted_role
       , p.privilege
       , p.table_name
from dba_role_privs r
     join dba_tab_privs p
     on r.granted_role = p.grantee
where r.grantee = 'B'
and p.owner = 'A'
/

  

“我怎么能列出他的权利   模式?“

像这样:

select owner
       , privilege
       , table_name 
from dba_tab_privs
where grantee = 'JOHN'
and owner IN ( 'A', 'B' )
order by owner, table_name
/

您可能希望省略OWNER上的过滤器。对第二个查询进行类似的调整将为您提供跨模式的授予角色。

select r.granted_role
       , p.privilege
       , p.table_name
from dba_role_privs r
     join dba_tab_privs p
     on r.granted_role = p.grantee
where r.grantee = 'JOHN'
and p.owner in ( 'A' , 'B')
/

答案 1 :(得分:1)

在Oracle中,用户是架构(USER = SCHEMA)。

您可以查询字典表DBA_TAB_PRIVS以查看用户/角色可以访问的内容。或者,如果您以用户A身份连接,则查询USER_TAB_PRIVS将让您查看哪些用户/角色可以访问您的对象(表,过程,包等)。

如果为角色提供了任何权限,请检查DBA_ROLE_PRIVS以查看哪个用户被授予此角色。

最后,检查DBA_SYS_PRIVS以查看是否向用户/角色授予了某些全局权限。大多数全局权限都有ANY名称(SELECT ANY TABLEEXECUTE ANY PROCEDURE ...)。全局权限优先于单个权限,可以让您直接或间接访问所有模式中的数据。


由于角色可以授予另一个角色,因此会变得更复杂一些。此查询将列出用户JOHN可访问的架构A中的所有对象:

SELECT DISTINCT table_name, PRIVILEGE
  FROM dba_tab_privs
 WHERE owner = 'A'
   AND (grantee = 'JOHN' OR
       grantee IN (SELECT dr.granted_role
                      FROM dba_role_privs dr
                     START WITH grantee = 'JOHN'
                    CONNECT BY PRIOR dr.granted_role = dr.grantee))

答案 2 :(得分:0)

首先创建样本用户“user_a”和“user_b”:

SQL> create user user_a identified by user_a default tablespace users temporary tablespace temp;
SQL> create user user_b identified by user_b default tablespace users temporary tablespace temp;
SQL> grant connect to user_a, user_b;
SQL> grant create session to user_a, user_b;
SQL> grant create table to user_a, user_b;
SQL> grant create view to user_a, user_b;
SQL> alter user user_a quota unlimited on users;
SQL> alter user user_b quota unlimited on users;

现在以USER_A身份连接并创建示例对象:

SQL> conn user_a/user_a
Connected.
SQL> create table tbl_a(id number, text varchar2(200));
Table created.
SQL> create view view_a as select id, text from tbl_a;
View created.

然后以USER_B身份连接并创建示例对象:

SQL> conn user_b/user_b
Connected.
SQL> create table tbl_b(id number, text varchar2(200));
Table created.
SQL> create view view_b as select id, text from tbl_b;
View created.

最后以USER_A的形式连接回来为他的表TBL_A:

提供搜索
SQL> conn user_a/user_a
Connected.
SQL> select count(1) from ALL_TAB_PRIVS where grantor = 'USER_A' and PRIVILEGE = 'SELECT' and GRANTEE = 'USER_B';

Out is:

  COUNT(1)
----------
         0

现在在USER_B的视图VIEW_A上授予选择权:

SQL> grant select on view_a to user_b;
Grant succeeded.

再次尝试为USER_B搜索授权,以便从USER_A查看对象VIEW_A:

SQL> select count(1) from ALL_TAB_PRIVS where grantor = 'USER_A' and PRIVILEGE = 'SELECT' and GRANTEE = 'USER_B';

现在的结果是:

  COUNT(1)
----------
         1