Извличането на всички потребителски привилегии в рамките на Oracle може да варира от проста задача с помощта на основна SQL заявка до усъвършенстван скрипт, в зависимост основно от това колко участващи роли и привилегии са конфигурирани в сървъра.
В този кратък урок ще обхванем както основния метод на SQL заявка, така и разширения метод на скрипт, така че няма да имате проблеми, независимо от сложността на вашата настройка.
Запитване на изгледи за привилегии на DBA/USER
Администратор на база данни (DBA) за Oracle може просто да изпълни заявка за преглед на редовете в DBA_SYS_PRIVS
, DBA_TAB_PRIVS
и DBA_ROLE_PRIVS
за извличане на информация за потребителските привилегии, свързани с system
, tables
и roles
, съответно.
Например DBA, който желае да види цялата system
привилегиите, предоставени на всички потребители, ще издадат следната заявка:
SELECT
*
FROM
DBA_SYS_PRIVS;
DBA_SYS_PRIVS
изгледът съдържа три колони с данни:
GRANTEE
е името, ролята или потребителят, на който е присвоено привилегията.PRIVILEGE
е привилегията, която е назначена.ADMIN_OPTION
показва дали предоставената привилегия включва иADMIN
опция.
За да определите кои потребители имат директни предоставяне на достъп до table
ще използваме DBA_TAB_PRIVS
изглед:
SELECT
*
FROM
DBA_TAB_PRIVS;
Можете да проверите официалната документация за повече информация относно колоните, върнати от тази заявка, но критичните колони са:
GRANTEE
е името на потребителя с предоставен достъп.TABLE_NAME
е името на обекта (таблица, индекс, последователност и т.н.).PRIVILEGE
е привилегията, присвоена наGRANTEE
за свързания обект.
И накрая, запитване на DBA_ROLE_PRIVS
изгледът има голяма част от същата информация, но приложима за roles
вместо това, където GRANTED_ROLE
колоната посочва въпросната роля:
SELECT
*
FROM
DBA_ROLE_PRIVS;
Запитване за привилегиите на текущия потребител
Ако достъпът до DBA не е възможен или е необходим, също така е възможно леко да промените горните заявки, за да видите привилегиите само за текущия потребител .
Това става чрез алтернативно запитване на USER_
версии на горния DBA_
изгледи. По този начин, вместо да гледате DBA_SYS_PRIVS
ще потърсим USER_SYS_PRIVS
, така:
SELECT
*
FROM
USER_SYS_PRIVS;
Тъй като USER_
изгледите с привилегии са на практика същите като техните DBA_
колеги, но специфични само за текущия потребител, типът на върнатите данни и имената на колони са идентични с тези при запитване на DBA_
вместо изгледи.
Разширен скрипт за намиране на всички привилегии
Докато горните методи ще работят за основни системни конфигурации, нещата започват да стават объркани в Oracle, когато съществуват много роли, които от своя страна дават привилегии за роли на други роли и така нататък надолу в заешката дупка. Тъй като DBA_
и USER_
изгледите с привилегии показват само GRANTEES
с пряко назначен достъп, често привилегиите, които са наследени чрез други роли, няма да се показват лесно.
За да разрешите този проблем, е препоръчително да използвате усъвършенстван скрипт, като доверената работа на Пийт Финиган и неговия find_all_privs.sql
скрипт. Можете също да изберете модифицирана версия от Дейвид Артър, find_all_privs2.sql
.
И в двата случая целта на тези скриптове е да ви позволят да рекурсивно намерете всички привилегии, предоставени на конкретен потребител. Когато скриптът намери role
за потребителя, той рекурсивно търси други роли и привилегии, предоставени на тази роля, повтаряйки процеса по целия път надолу по веригата. Резултатите от скрипта могат да бъдат изведени на екрана или във файл по желание.
Повече информация за тези скриптове и тяхното използване можете да намерите на petefinnigan.com.