Просмотр всех прав в Oracle DB: включая temp table grants
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для получения списка привилегий, назначенных пользователю в MySQL, используйте запрос:
SELECT privilege_type FROM information_schema.user_privileges WHERE grantee = 'user@host';
user@host
нужно заменить на актуальные имя пользователя и хост. В PostgreSQL и Oracle запросы отправляются к соответствующим системным каталогам или словарным представлениям.
В Oracle можно получить доступ к системным привилегиям следующим образом:
SELECT privilege
FROM dba_sys_privs
WHERE grantee = 'USERNAME';
Замените 'USERNAME'
на имя пользователя, которое вас интересует. Не забывайте про объектные прямые привилегии, привилегии на основе ролей и привилегии на уровне столбцов, чтобы составить полный список.
Подход "показать мне все"
Прямые системные и объектные разрешения
Чтобы извлечь системные привилегии пользователя, обратитесь к dba_sys_privs
:
-- Всегда хочется ещё!
SELECT *
FROM dba_sys_privs
WHERE grantee = 'USERNAME';
Прямые разрешения на таблицы или представления можно запросить через dba_tab_privs
:
-- Разрешения острые как чили
SELECT *
FROM dba_tab_privs
WHERE grantee = 'USERNAME';
Разрешения на основе ролей – это важно!
Роли включают набор разрешений. Чтобы их просмотреть, воспользуйтесь:
-- Проверим все ли роли на месте?
SELECT *
FROM dba_role_privs
WHERE grantee = 'USERNAME';
Для просмотра системных привилегий, связанных с этими ролями, используйте запрос:
-- У ролей тоже есть свои привилегии
SELECT rp.grantee, sp.privilege
FROM dba_role_privs rp
JOIN role_sys_privs sp ON rp.granted_role = sp.role
WHERE rp.grantee = 'USERNAME';
Объединяем все вместе
Если вам нужно узнать все объектные разрешения, используйте all_tab_privs_recd
:
-- Этот запрос – ваш центр управления
SELECT *
FROM all_tab_privs_recd
WHERE grantee = 'USERNAME';
Не забывайте, что all_tab_privs_recd
может несодержать информацию о временных таблицах.
DBMS_METADATA, мой новый друг
С помощью пакета DBMS_METADATA
в Oracle можно получить все сразу, как на шведском столе:
SELECT DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT','USERNAME') FROM DUAL;
SELECT DBMS_METADATA.GET_GRANTED_DDL('ROLE_GRANT','USERNAME') FROM DUAL;
SELECT DBMS_METADATA.GET_GRANTED_DDL('SYSTEM_GRANT','USERNAME') FROM DUAL;
Обязательно замените 'USERNAME'
на реальное имя пользователя и учтите использование регистра.
Преобразование данных
Обратите внимание на возможные дубликаты, чтобы результаты запросов были четкими и организованными.
Визуализация
Представьте офисное здание (🏢) с различными уровнями безопасности:
👤 Пользователь: Алиса
🏢 Этажи здания: [Первый 🌍, Второй 🥇, Третий 🥈, Четвертый 🥉]
Список привилегий – это ваши карты доступа, выданные Алисе:
Первый 🌍 этаж: 🎟️ Доступ (SELECT)
Второй 🥇 этаж: 🚫 Доступ отсутствует
Третий 🥈 этаж: 🎟️ Доступ (UPDATE), 🎫 Все права (ADMIN PRIVILEGES)
Четвертый 🥉 этаж: 🎟️ Доступ (INSERT)
Навигация в неопределенностях
Анализ иерархии ролей
Для получения информации о привилегиях ролей и их иерархии используйте рекурсивный запрос:
-- Дорога к ролям, где путь важнее конечной точки
WITH RECURSIVE role_privs (role, privilege) AS (
SELECT granted_role, privilege
FROM role_sys_privs
WHERE role IN (SELECT granted_role FROM dba_role_privs WHERE grantee = 'USERNAME')
UNION ALL
SELECT rsp.granted_role, rsp.privilege
FROM role_sys_privs rsp, role_privs rp
WHERE rsp.role = rp.role
)
SELECT * FROM role_privs;
Временные таблицы
Проверьте, есть ли в общих представлениях привилегии временных таблиц, возможно вам потребуется их добавить в запросы.
Разрешения на конкретные столбцы
Для просмотра привилегий по столбцам используйте представление DBA_TAB_PRIVS
:
-- Права на столбцы определяет не судьба, а запрос
SELECT grantee, table_name, column_name, privilege
FROM dba_tab_privs
WHERE grantee = 'USERNAME'
AND column_name IS NOT NULL;
Выключаем стандартные схемы
Чтобы сфокусироваться на привилегиях пользователя, исключите стандартные схемы:
-- SYS и SYSTEM идут в сторонку, мы сосредотачиваемся на пассиве
SELECT *
FROM dba_tab_privs
WHERE grantee != 'SYS' AND grantee != 'SYSTEM' AND grantee = 'USERNAME';
Полезные материалы
- MySQL :: Руководство по MySQL 8.0 :: 13.7.7.21 Выражение SHOW GRANTS
- GRANT
- PostgreSQL: Документация: 16: 9.26. Функции и операторы системной информации
- GRANT Server Permissions (Transact-SQL) – SQL Server | Microsoft Learn
- SHOW GRANTS – База знаний MariaDB
- Как Создать Нового Пользователя и Назначить Права в MySQL | DigitalOcean