我在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拥有的模式下的一个视图。我如何列出他在模式中的权限?
答案 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 TABLE
,EXECUTE 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