122 votes

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 fonctionnalité TOAD pour comparer les schémas, mais cela ne montre pas les subventions tentables, etc., alors voici ma question:

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

164voto

DCookie Points 22921

Si vous voulez plus que des subventions directes de table (par exemple, des subventions 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;
 

39voto

Juris Points 626

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

 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 .

25voto

Alex Cherkas Points 61

Désolé les gars, mais la sélection de all_tab_privs_recd où bénéficiaire = 'votre' utilisateur ne donne pas de sortie à l'exception des subventions publiques et de l'utilisateur actuel des subventions si vous exécutez le sélectionner à partir d'un autre (disons, SYS) de l'utilisateur. La documentation dit,

ALL_TAB_PRIVS_RECD décrit les types de subventions:

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 administrateur de base et souhaitez ajouter à la liste de tous les objets de subventions pour un particulier (pas de SYS lui-même) de l'utilisateur, vous ne pouvez pas utiliser ce système en vue.

Dans ce cas, vous devez effectuer une requête plus complexe. Voici une prise (tracé) à partir de CRAPAUD pour sélectionner tous les objets de subventions pour un utilisateur en 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;

Ce sera la liste de tous les objet de subventions (y compris la colonne de subventions) pour votre (spécifié) de l'utilisateur. Si vous ne voulez pas de colonne au niveau des subventions, puis supprimez tous partie de la sélection commençant par "union" de la clause.

UPD: l'Étude de la documentation, j'ai trouvé un autre point de vue qui répertorie toutes les subventions moyen beaucoup plus simple:

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

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

5voto

Sujit Points 31
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')
;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X