Hentning af alle brugerrettigheder i Oracle kan variere fra en simpel opgave ved hjælp af en grundlæggende SQL-forespørgsel til et avanceret script, primært afhængigt af, hvor involverede rollerne og privilegierne er konfigureret på serveren.
I denne korte vejledning dækker vi både den grundlæggende SQL-forespørgselsmetode såvel som den avancerede scriptmetode, så du ikke har noget problem uanset kompleksiteten af din opsætning.
Forespørgsel på DBA/BRUGER-privilegievisninger
En databaseadministrator (DBA) for Oracle kan simpelthen udføre en forespørgsel for at se rækkerne i DBA_SYS_PRIVS
, DBA_TAB_PRIVS
, og DBA_ROLE_PRIVS
for at hente information om brugerrettigheder relateret til system
, tables
, og roles
hhv.
For eksempel en DBA, der ønsker at se alle system
privilegier givet til alle brugere ville udstede følgende forespørgsel:
SELECT
*
FROM
DBA_SYS_PRIVS;
DBA_SYS_PRIVS
visningen indeholder tre kolonner med data:
GRANTEE
er navnet, rollen eller brugeren, der blev tildelt privilegiet.PRIVILEGE
er det privilegium, der er tildelt.ADMIN_OPTION
angiver, om det tildelte privilegium også inkludererADMIN
mulighed.
For at afgøre, hvilke brugere der har direkte give adgang til en table
vi bruger DBA_TAB_PRIVS
se:
SELECT
*
FROM
DBA_TAB_PRIVS;
Du kan tjekke den officielle dokumentation for mere information om de kolonner, der returneres fra denne forespørgsel, men de kritiske kolonner er:
GRANTEE
er navnet på brugeren med tildelt adgang.TABLE_NAME
er navnet på objektet (tabel, indeks, sekvens osv.).PRIVILEGE
er det privilegium, der er tildeltGRANTEE
for det tilknyttede objekt.
Til sidst forespørger du DBA_ROLE_PRIVS
visningen har meget af de samme oplysninger, men gælder for roles
i stedet hvor GRANTED_ROLE
kolonne angiver den pågældende rolle:
SELECT
*
FROM
DBA_ROLE_PRIVS;
Forespørgsel efter den aktuelle brugers privilegier
Hvis DBA-adgang ikke er mulig eller nødvendig, er det også muligt at ændre ovenstående forespørgsler lidt for at se privilegierne udelukkende for den aktuelle bruger .
Dette gøres ved alternativt at forespørge USER_
versioner af ovenstående DBA_
visninger. Således i stedet for at se på DBA_SYS_PRIVS
vi ville forespørge USER_SYS_PRIVS
, sådan:
SELECT
*
FROM
USER_SYS_PRIVS;
Siden USER_
privilegievisninger er faktisk de samme som deres DBA_
modparter, men kun specifikke for den aktuelle bruger, typen af returnerede data og kolonnenavne er alle identiske med dem, når du forespørger DBA_
visninger intead.
Avanceret script til at finde alle privilegier
Selvom ovenstående metoder vil fungere for grundlæggende systemkonfigurationer, begynder tingene at blive rodet i Oracle, når der eksisterer mange roller, som igen giver rolleprivilegier til andre roller, og så videre nede i kaninhullet. Siden DBA_
og USER_
privilegievisninger viser kun GRANTEES
med direkte tildelt adgang, vil ofte privilegier, der er nedarvet gennem andre roller, ikke umiddelbart blive vist.
For at løse dette, er det tilrådeligt at bruge et avanceret script, såsom Pete Finnigans betroede arbejde og hans find_all_privs.sql
manuskript. Du kan også vælge en ændret version af David Arthur, find_all_privs2.sql
.
I begge tilfælde er formålet med disse scripts at give dig mulighed for rekursivt finde alle privilegier givet til en bestemt bruger. Når scriptet finder en role
for brugeren søger den rekursivt efter andre roller og privilegier givet til denne rolle, og gentager processen hele vejen ned i kæden. Resultaterne af scriptet kan outputtes til skærmen eller til en fil efter ønske.
Mere information om disse scripts og deres brug kan findes på petefinnigan.com.