web-dev-qa-db-fra.com

Comment puis-je lister TOUTES les subventions reçues par un utilisateur?

J'ai besoin de voir toutes les subventions sur une base de données Oracle.

J'ai utilisé la fonction TOAD pour comparer les schémas, mais cela ne montre pas les subventions tentables, etc.

Comment répertorier toutes les subventions d'une base de données Oracle?

88
guerda

Si vous souhaitez plus que des attributions directes de table (par exemple, des attributions via des rôles, des privilèges système tels que la sélection d'une table, etc.), voici quelques requêtes 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;

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;
125
DCookie

En supposant que vous souhaitiez répertorier les droits sur tous les objets qu'un utilisateur particulier a reç:

select * from all_tab_privs_recd where grantee = 'your user'

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

31
Juris

Désolé les gars, mais si vous sélectionnez all_tab_privs_recd où attributaire = "votre utilisateur" ne produira aucun résultat, à l'exception des subventions publiques et des autorisations d'utilisateur actuelles, si vous exécutez l'option select d'un autre utilisateur (disons SYS). Comme le dit la documentation,

ALL_TAB_PRIVS_RECD décrit les types d’attribution suivants:

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

Par conséquent, si vous êtes un administrateur de base de données et souhaitez répertorier tous les objets octroyés à un utilisateur particulier (pas à 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 attributions d'objets 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 attributions d'objets (y compris les attributions de colonnes) pour votre utilisateur (spécifié). Si vous ne souhaitez pas que les attributions au niveau des colonnes soient supprimées, supprimez toutes les parties de la clause commençant par la clause 'union'.

UPD: En étudiant la documentation, 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';

N'oubliez pas qu'il existe une vue non DBA_TAB_PRIVS_RECD dans Oracle.

16
Alex Cherkas

La méthode la plus complète et la plus fiable que je connaisse consiste toujours à utiliser 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;

Des réponses intéressantes cependant.

11
Matteo Steccolini
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
Sujit