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 inkluderarADMIN
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 tilldelatsGRANTEE
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.