2009-08-19 5 views

Répondre

99

Si vous voulez plus que des subventions de table directes (par exemple, les subventions par des rôles, privilèges système tels que sélectionner une table, etc.), voici quelques questions supplémentaires:

privilèges système pour un utilisateur:

SELECT PRIVILEGE 
    FROM sys.dba_sys_privs 
WHERE grantee = <theUser> 
UNION 
SELECT PRIVILEGE 
    FROM dba_role_privs rp JOIN role_sys_privs rsp ON (rp.granted_role = rsp.role) 
WHERE rp.grantee = <theUser> 
ORDER BY 1; 

Les subventions directes aux tables/vues:

SELECT owner, table_name, select_priv, insert_priv, delete_priv, update_priv, references_priv, alter_priv, index_priv 
    FROM table_privileges 
WHERE grantee = <theUser> 
ORDER BY owner, table_name; 

subventions indirectes aux tables/vues:

SELECT DISTINCT owner, table_name, PRIVILEGE 
    FROM dba_role_privs rp JOIN role_tab_privs rtp ON (rp.granted_role = rtp.role) 
WHERE rp.grantee = <theUser> 
ORDER BY owner, table_name; 
+1

Vous ne pouvez pas avoir le droit de voir la table sys.dba_sys_privs. – Hannes

+1

Absolument correct. Voir votre DBA. S'ils refusent, ils peuvent avoir des problèmes de sécurité légitimes. Voir le contenu de ces vues donne à l'utilisateur des informations qu'il ne pourrait pas avoir autrement. – DCookie

+2

Il serait intéressant de rejoindre la table 'role_role_privs', puis de CONNECTER BY PRIOR granted_role = role' pour rechanger les privilèges de rôle transitif ... –

27

En supposant que vous voulez à la liste des subventions sur tous les objets un utilisateur particulier a reçu :

select * from all_tab_privs_recd where grantee = 'your user' 

Cela ne retourne pas des objets appartenant à l'utilisateur. Si vous en avez besoin, utilisez plutôt la vue all_tab_privs.

4
select distinct 'GRANT '||privilege||' ON '||OWNER||'.'||TABLE_NAME||' TO '||RP.GRANTEE 
from DBA_ROLE_PRIVS RP join ROLE_TAB_PRIVS RTP 
on (RP.GRANTED_ROLE = RTP.role) 
where (OWNER in ('YOUR USER') --Change User Name 
    OR RP.GRANTEE in ('YOUR USER')) --Change User Name 
and RP.GRANTEE not in ('SYS', 'SYSTEM') 
; 
+5

Une explication pourrait aider cette réponse, car lorsque d'autres personnes viennent la trouver. –

12

Désolé les gars, mais la sélection de all_tab_privs_recd où impétrant = votre utilisateur "ne donnera aucune sortie à l'exception des subventions publiques et des subventions de l'utilisateur actuel si vous exécutez la sélection à partir d'un autre (disons, SYS) utilisateur . Comme documentation dit,

ALL_TAB_PRIVS_RECD décrit les types de subventions suivantes:

Object grants for which the current user is the grantee 
Object grants for which an enabled role or PUBLIC is the grantee 

Donc, si vous êtes un DBA et que vous voulez énumérer tous objet subventions pour un particulier (non SYS lui-même), vous ne pouvez pas utiliser cette vue système.

Dans ce cas, vous devez effectuer une requête plus complexe. Voici une prise (tracée) de TOAD pour sélectionner toutes les subventions d'objet pour un utilisateur particulier:

select tpm.name privilege, 
     decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable, 
     ue.name grantee, 
     ur.name grantor, 
     u.name owner, 
     decode(o.TYPE#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER', 
         4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE', 
         7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE', 
         11, 'PACKAGE BODY', 12, 'TRIGGER', 
         13, 'TYPE', 14, 'TYPE BODY', 
         19, 'TABLE PARTITION', 20, 'INDEX PARTITION', 21, 'LOB', 
         22, 'LIBRARY', 23, 'DIRECTORY', 24, 'QUEUE', 
         28, 'JAVA SOURCE', 29, 'JAVA CLASS', 30, 'JAVA RESOURCE', 
         32, 'INDEXTYPE', 33, 'OPERATOR', 
         34, 'TABLE SUBPARTITION', 35, 'INDEX SUBPARTITION', 
         40, 'LOB PARTITION', 41, 'LOB SUBPARTITION', 
         42, 'MATERIALIZED VIEW', 
         43, 'DIMENSION', 
         44, 'CONTEXT', 46, 'RULE SET', 47, 'RESOURCE PLAN', 
         66, 'JOB', 67, 'PROGRAM', 74, 'SCHEDULE', 
         48, 'CONSUMER GROUP', 
         51, 'SUBSCRIPTION', 52, 'LOCATION', 
         55, 'XML SCHEMA', 56, 'JAVA DATA', 
         57, 'EDITION', 59, 'RULE', 
         62, 'EVALUATION CONTEXT', 
         'UNDEFINED') object_type, 
     o.name object_name, 
     '' column_name 
     from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue, 
      table_privilege_map tpm 
     where oa.obj# = o.obj# 
      and oa.grantor# = ur.user# 
      and oa.grantee# = ue.user# 
      and oa.col# is null 
      and oa.privilege# = tpm.privilege 
      and u.user# = o.owner# 
      and o.TYPE# in (2, 4, 6, 9, 7, 8, 42, 23, 22, 13, 33, 32, 66, 67, 74, 57) 
    and ue.name = 'your user' 
    and bitand (o.flags, 128) = 0 
union all -- column level grants 
select tpm.name privilege, 
     decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable, 
     ue.name grantee, 
     ur.name grantor, 
     u.name owner, 
     decode(o.TYPE#, 2, 'TABLE', 4, 'VIEW', 42, 'MATERIALIZED VIEW') object_type, 
     o.name object_name, 
     c.name column_name 
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue, 
    sys.col$ c, table_privilege_map tpm 
where oa.obj# = o.obj# 
    and oa.grantor# = ur.user# 
    and oa.grantee# = ue.user# 
    and oa.obj# = c.obj# 
    and oa.col# = c.col# 
    and bitand(c.property, 32) = 0 /* not hidden column */ 
    and oa.col# is not null 
    and oa.privilege# = tpm.privilege 
    and u.user# = o.owner# 
    and o.TYPE# in (2, 4, 42) 
    and ue.name = 'your user' 
    and bitand (o.flags, 128) = 0; 

Ceci listera toutes les subventions d'objets (y compris les subventions de colonne) pour votre utilisateur (spécifié). Si vous ne voulez pas d'allocations au niveau des colonnes, supprimez toutes les parties du select commençant par la clause 'union'.

UPD: L'étude de la documentation que j'ai trouvé une autre vue qui répertorie toutes les subventions de manière beaucoup plus simple:

select * from DBA_TAB_PRIVS where grantee = 'your user'; 

Gardez à l'esprit qu'il n'y a pas vue DBA_TAB_PRIVS_RECD dans Oracle.

7

La méthode la plus complète et fiable, je sais encore en utilisant DBMS_METADATA:

select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', :username) from dual; 
select dbms_metadata.get_granted_ddl('OBJECT_GRANT', :username) from dual; 
select dbms_metadata.get_granted_ddl('ROLE_GRANT', :username) from dual; 

réponses intéressantes cependant.

Questions connexes