2010-08-26 4 views
1

J'ai un propriétaire A et un propriétaire B dans la base de données. Chacun d'entre eux a ses propres schémas, etc. Si j'accorde des droits à un utilisateur de B (donc il a par exemple accès à une vue sous A), y a-t-il un moyen d'afficher des privilèges comme ça? Je veux dire, un utilisateur a des droits sous chaque propriétaire de BD et ses schémas. La raison en est que je dois être sûr qu'aucun utilisateur sous B a accès à un objet sous A. Merci beaucoupOracle DB - comment afficher les privations à travers les schémas/propriétaires?

EDIT: Pour la question plus claire:

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

Maintenant, disons que l'utilisateur John a accès aux schémas sous le propriétaire A mais aussi à une vue sous le schéma appartenant au propriétaire d'Oracle B. Comment pourrais-je lister ses droits sur les schémas?

Répondre

1

Dans Oracle un utilisateur est un schéma (USER = SCHEMA).

Vous pouvez interroger la table de dictionnaire DBA_TAB_PRIVS pour voir à quoi les utilisateurs/rôles ont accès. Alternativement, si vous êtes connecté en tant qu'utilisateur A, interroger USER_TAB_PRIVS vous permettra de voir quels utilisateurs/rôles ont accès à vos objets (tables, procédures, packages, etc ...).

Si un privilège est attribué à un rôle, vérifiez DBA_ROLE_PRIVS pour voir quel utilisateur a obtenu ce rôle.

Enfin, vérifiez DBA_SYS_PRIVS pour voir si un privilège global est accordé à un utilisateur/rôle. La plupart des privilèges globaux ont ANY dans leur nom (SELECT ANY TABLE, EXECUTE ANY PROCEDURE ...). Les privilèges globaux ont la priorité sur les privilèges individuels et peuvent vous permettre d'accéder directement ou indirectement à des données à travers tous les schémas.


Cela devient un peu plus compliqué car un rôle peut être attribué à un autre rôle. Cette requête va lister tous les objets du schéma A accessible à l'utilisateur JOHN:

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)) 
1

Pour ce faire, vous devez utiliser l'une des vues DBA.

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

Si vous utilisez des rôles, vous pouvez également vérifier que: « Comment pourrais-je énumérer ses droits à travers schémas »

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' 
/

Comme ceci:

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

Vous pouvez omettre le filtre propriétaire. Un réglage similaire sur la deuxième requête vous donnera des rôles accordés à travers les schémas.

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') 
/
+0

Merci, mais ce n'est probablement pas correct - A et B sont des propriétaires de bases de données avec leurs propres objets. – Kalamro

+1

@Kalamro - votre terminologie prête à confusion. Il n'y a pas de "propriétaires de bases de données" dans Oracle, il n'y a que des utilisateurs. Un SCHEMA est juste la collection d'objets appartenant à un utilisateur. Ils sont des choses séparées, mais il existe une relation un-à-un entre eux: http://radiofreetooting.blogspot.com/2007/02/user-schema.html – APC

+0

Merci. Je suis un utilisateur de MSSQL donc j'ai mal compris le point. En outre, la première requête est suffisante pour trouver tous les droits dans le schéma A? – Kalamro

0

Tout d'abord créer exemples d'utilisateurs "de user_a" et "Utilisateur_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; 

maintenant Se connecter en tant user_a et de créer des exemples d'objets:

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. 

Connectez ensuite comme Utilisateur_b et créer des objets d'échantillons :

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. 

An d enfin se connecter en arrière comme user_a une subvention de recherche pour sa table 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 est:

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

Maintenant GRANT SELECT sur la vue VIEW_A pour Utilisateur_b:

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

et essayez à nouveau recherche des subventions pour USER_B pour afficher l'objet VIEW_A de USER_A:

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

Et maintenant est resultat:

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

Désolé, les propriétaires A et B sont propriétaires de propriétaires/schémas. – Kalamro

Questions connexes