sql >> Database teknologi >  >> RDS >> Oracle

Sådan viser du alle Oracle-databaseprivilegier for en bruger

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å inkluderer ADMIN 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 tildelt GRANTEE 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.


  1. How to_timestamp() virker i PostgreSQL

  2. Er der nogen forskel mellem DECIMAL og NUMERIC i SQL Server?

  3. Hvordan forbinder du til flere MySQL-databaser på en enkelt webside?

  4. Hvordan migrerer man en PostgreSQL-database til en SQLServer-database?