# [ORACLE] Roles und SubRoles von Usern / role_role_privs



## XChris (3. August 2010)

Hallo,

ich möchte alle Rollen eines Nutzer wissen. Außerdem auch die Rollen, welche er durch die direkt zugewiesen Rollen erhält.

Alle Rollen erhalte ich mit

```
select * from dba_role_privs;
```

Für die Rollen in Rollen gibt es role_role_privs. Also muss ein rekursives Selfjoin her:


```
select role, granted role from role_role_privs start with role='DBA' connect by prior role=granted_role;
```

Jedoch hab ich keinen Schimmer, wie ich dieses select auf eine Rolle einschränken kann. Obriges SQL Statement zeigt mir immer alle abhängig Rollen.

Chris


----------



## Henig (3. August 2010)

Kannst du bitte die Tabellen posten, damit ich mal son einen Überblick habe was du wie benannt, verknüpft hast etc

Gruß =)


----------



## XChris (3. August 2010)

Klar:

Es ist nur eine Tabelle. Eine Systemtabelle von Oracle: role_role_privs. Hier der Aufbau:


```
ROLE (Role Name)
GRANTED_ROLE (Role which was granted)
ADMIN_OPTION (Grant was with the ADMIN option)
```

Zur Erklärung:
Ein Nutzer hat z.B. die Rolle "imp_full_database". Dann erhält er auch die Rolle "select_catalog_role". Erhält er diese Rolle, dann gibt es auch "hs_admin_role".

In Der Tabelle sieht das so aus:

```
role                            granted_role
imp_full_database         select_catalog_role
select_catalog_role       hs_admin_role
imp_full_database         excute_catalog_role
etc.
```


----------



## Henig (3. August 2010)

da solltest du insofern du die Freiheit hast deine DB-Struktur ändern...

eine Tabelle Role und eine granted_role


```
RoleTbl:
---------------------------------------------
Role_ID   Role    Granted_role_ID
    1       Rolle1          1
    2       Rolle2          2
    3       Rolle3          3


Granted_RoleTbl:
---------------------------------------------
Granted_Role_ID   Role_ID
         2                  1
         3                  2
         4                  3
```

es ist SEHR GEWAGT und ich weiß auhc nicht ob das so umsetzbar ist aber in der theorie müsstest du jetzt abfragen können, die zugewiesene rolle und alle Rollen , die eine kleinere ID haben die Priorität legst du halt in der DB fest ^^

sry ich bin kein Profi in sachen SQL aber so würde ich versuchen es zu lösen  ^^

Grüße


----------



## XChris (3. August 2010)

Hab die Lösung.


```
select ...
from role_role_privs
start with role='NameDerRolle'
connect by role = prior granted_role;
```

@Hening
Sorry, du hast weder mein Posting gelesen noch ausreichend Kenntnisse. role_role_rpivs sind Systemtabellen!
Aber danke fürs den Versuch des Helfens.


----------



## Henig (3. August 2010)

Das beleidigt mich jetzt aber 
Das posting hab ich aufjedenfall gelesen sonst wüde ich mich hier ja nciht hinsetzten und mir für dich ne Lösung überlegen 

Und von Systemtabellen hab ich (trotz ITA-Abschluss) nie was gehört sry 

Grüße


----------



## XChris (3. August 2010)

Sorry.

Siehe private Message. Nochmals Danke für den Hilfeversuch.


----------



## dbwizard (4. August 2010)

Henig hat gesagt.:


> Und von Systemtabellen hab ich (trotz ITA-Abschluss) nie was gehört sry
> Grüße


 
Das ist bitter. Ich würde in diesem Falle die Finger von Oracle lassen 

Gruss (Nix für ungut, dass hat mich jetzt einfach gejuckt)


----------

