Comment puis-je répertorier TOUTES les subventions qu'un utilisateur a reçues?

97

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 elle ne montre pas les subventions tentables, etc., voici donc ma question:

Comment puis-je répertorier toutes les subventions sur une base de données Oracle?

Guerda
la source

Réponses:

141

Si vous voulez plus que de simples attributions de table directes (par exemple, des attributions via des rôles, des privilèges système tels que sélectionner n'importe quelle 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;

Attributions 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;

Attributions 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;
DCookie
la source
1
Vous n'avez peut-être pas le droit de voir la table sys.dba_sys_privs.
Hannes
1
Absolument correct. Consultez votre DBA. S'ils refusent, ils peuvent avoir des problèmes de sécurité légitimes. Voir le contenu de ces vues donne à un utilisateur des informations qu'il ne pourrait pas avoir autrement.
DCookie
2
Il serait intéressant de quitter la role_role_privstable, puis CONNECT BY PRIOR granted_role = rolede rentrer dans les privilèges de rôle transitifs ...
Lukas Eder
33

En supposant que vous souhaitiez lister les subventions sur tous les objets qu'un utilisateur particulier a reçus :

select * from all_tab_privs_recd where grantee = 'your user'

Cela ne renverra pas les objets appartenant à l'utilisateur. Si vous en avez besoin, utilisez all_tab_privsplutôt view.

Juris
la source
20

Désolé les gars, mais la sélection de all_tab_privs_recd où grantee = 'votre utilisateur' ne donnera aucune sortie sauf les subventions publiques et les subventions utilisateur actuelles si vous exécutez la sélection à partir d'un autre (disons, SYS) utilisateur. Comme le dit la documentation,

ALL_TAB_PRIVS_RECD décrit les types d'octroi suivants:

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 souhaitez répertorier toutes les attributions d' objet pour un utilisateur particulier (et 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. En voici une prise (tracée) de TOAD pour sélectionner toutes les attributions 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;

Cela listera toutes les attributions d'objet (y compris les attributions de colonne) pour votre utilisateur (spécifié). Si vous ne voulez pas d'attributions au niveau de la colonne, supprimez toutes les parties de la sélection 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';

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

Alex Cherkas
la source
12

La méthode la plus complète et la plus fiable que je connaisse est toujours d'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.

Matteo Steccolini
la source
5
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')
;
Sujit
la source
7
Une explication aiderait cette réponse, lorsque d'autres personnes viennent la trouver.
Andrew Barber
0

La requête suivante peut être utilisée pour obtenir tous les privilèges d'un utilisateur. Fournissez simplement le nom d'utilisateur dans la première requête et vous obtiendrez tous les privilèges pour cela

WITH users AS (SELECT 'SCHEMA_USER' usr FROM dual), Roles AS (SELECT allowed_role FROM dba_role_privs rp JOIN users ON rp.GRANTEE = users.usr UNION SELECT given_role FROM role_role_privs WHERE role IN (SELECT given_role FROM dba_role_privs rp. GRANTEE = users.usr)), tab_privilage AS (SELECT OWNER, TABLE_NAME, PRIVILEGE FROM role_tab_privs rtp JOIN roles r ON rtp.role = r.granted_role UNION SELECT OWNER, TABLE_NAME, PRIVILEGE FROM Dba_Tab_Privs dtp JOIN Users ON dtp.grantee = users. usr), sys_privileges AS (SELECT privilège FROM dba_sys_privs dsp JOIN users ON dsp.grantee = users.usr) SELECT * FROM tab_privilage ORDER BY owner, table_name --SELECT * FROM sys_privileges

Pradeep Dewani
la source