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 PRIVILEGEFROM sys.dba_sys_privsWHERE grantee =<theUser>UNIONSELECT PRIVILEGE FROM dba_role_privs rp JOIN role_sys_privs rsp ON(rp.granted_role = rsp.role)WHERE rp.grantee =<theUser>ORDERBY1;
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.
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 currentuseris the grantee
Object grants for which an enabled role orPUBLICis 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:
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.
selectdistinct'GRANT '||privilege||' ON '||OWNER||'.'||TABLE_NAME||' TO '||RP.GRANTEEfrom DBA_ROLE_PRIVS RP join ROLE_TAB_PRIVS RTP on(RP.GRANTED_ROLE = RTP.role)where(OWNER in('YOUR USER')--Change User NameOR RP.GRANTEE in('YOUR USER'))--Change User Nameand RP.GRANTEE notin('SYS','SYSTEM');
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
role_role_privs
table, puisCONNECT BY PRIOR granted_role = role
de rentrer dans les privilèges de rôle transitifs ...En supposant que vous souhaitiez lister les subventions sur tous les objets qu'un utilisateur particulier a reçus :
Cela ne renverra pas les objets appartenant à l'utilisateur. Si vous en avez besoin, utilisez
all_tab_privs
plutôt view.la source
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,
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:
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:
Gardez à l'esprit qu'il n'y a pas de vue DBA_TAB_PRIVS_RECD dans Oracle.
la source
La méthode la plus complète et la plus fiable que je connaisse est toujours d'utiliser DBMS_METADATA :
Des réponses intéressantes cependant.
la source
la source
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
la source