sql >> Databasteknik >  >> RDS >> Oracle

Hur man visar alla Oracle Database-privilegier för en användare

Att hämta alla användarbehörigheter inom Oracle kan sträcka sig från en enkel uppgift med en grundläggande SQL-fråga till ett avancerat skript, främst beroende på hur involverade rollerna och privilegierna är konfigurerade inom servern.

I den här korta handledningen kommer vi att täcka både den grundläggande SQL-frågemetoden och den avancerade skriptmetoden så att du inte har några problem oavsett hur komplex din installation är.

Fråga DBA/USER Privilege Views

En databasadministratör (DBA) för Oracle kan helt enkelt köra en fråga för att se raderna i DBA_SYS_PRIVS , DBA_TAB_PRIVS och DBA_ROLE_PRIVS för att hämta information om användarbehörigheter relaterade till system , tables och roles , respektive.

Till exempel en DBA som vill se alla system privilegier som ges till alla användare skulle utfärda följande fråga:

SELECT
  *
FROM
  DBA_SYS_PRIVS;

DBA_SYS_PRIVS vyn innehåller tre kolumner med data:

  • GRANTEE är namnet, rollen eller användaren som tilldelades privilegiet.
  • PRIVILEGE är den behörighet som tilldelas.
  • ADMIN_OPTION indikerar om den beviljade behörigheten även inkluderar ADMIN alternativ.

För att avgöra vilka användare som har direkt ge åtkomst till en table vi använder DBA_TAB_PRIVS visa:

SELECT
  *
FROM
  DBA_TAB_PRIVS;

Du kan kontrollera den officiella dokumentationen för mer information om kolumnerna som returneras från den här frågan, men de kritiska kolumnerna är:

  • GRANTEE är namnet på användaren med beviljad åtkomst.
  • TABLE_NAME är namnet på objektet (tabell, index, sekvens, etc).
  • PRIVILEGE är den behörighet som tilldelats GRANTEE för det associerade objektet.

Slutligen, fråga efter DBA_ROLE_PRIVS vyn har mycket av samma information men är tillämplig på roles istället, där GRANTED_ROLE kolumnen anger rollen i fråga:

SELECT
  *
FROM
  DBA_ROLE_PRIVS;

Fråga den aktuella användarens rättigheter

Om DBA-åtkomst inte är möjlig eller nödvändig är det också möjligt att ändra ovanstående frågor något för att se privilegierna enbart för den aktuella användaren .

Detta görs genom att alternativt fråga USER_ versioner av ovanstående DBA_ vyer. Alltså istället för att titta på DBA_SYS_PRIVS vi skulle fråga USER_SYS_PRIVS , som så:

SELECT
  *
FROM
  USER_SYS_PRIVS;

Sedan USER_ behörighetsvyer är i praktiken desamma som deras DBA_ motsvarigheter, men endast specifika för den aktuella användaren, typen av returnerad data och kolumnnamn är alla identiska med dem när man frågar DBA_ visningar intead.

Avancerat skript för att hitta alla rättigheter

Även om metoderna ovan kommer att fungera för grundläggande systemkonfigurationer, börjar det bli rörigt i Oracle när det finns många roller som i sin tur ger rollprivilegier till andra roller, och så vidare i kaninhålet. Sedan DBA_ och USER_ privilegievyer visar endast GRANTEES med direkt tilldelad åtkomst, ofta kommer privilegier som är nedärvda genom andra roller inte att visas lätt.

För att lösa detta är det tillrådligt att använda ett avancerat skript som Pete Finnigans betrodda arbete och hans find_all_privs.sql manus. Du kan också välja en modifierad version av David Arthur, find_all_privs2.sql .

I båda fallen är syftet med dessa skript att låta dig rekursivt hitta alla privilegier som beviljats ​​en viss användare. När skriptet hittar en role för användaren söker den rekursivt efter andra roller och privilegier som tilldelats den rollen, och upprepar processen hela vägen ner i kedjan. Resultaten av skriptet kan matas ut på skärmen eller till en fil efter önskemål.

Mer information om dessa skript och deras användning finns på petefinnigan.com.


  1. Oracle:Kombinera flera resultat i en underfråga till ett enda kommaseparerat värde

  2. Göra ändringar i flera poster baserat på ändring av en enda post med SQL

  3. 2 sätt att sammanfoga en sträng och ett nummer i Oracle

  4. oracle sql:uppdatera om det finns annat infoga