Просмотр всех прав в Oracle DB: включая temp table grants

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для получения списка привилегий, назначенных пользователю в MySQL, используйте запрос:

SQL
Скопировать код
SELECT privilege_type FROM information_schema.user_privileges WHERE grantee = 'user@host';

user@host нужно заменить на актуальные имя пользователя и хост. В PostgreSQL и Oracle запросы отправляются к соответствующим системным каталогам или словарным представлениям.

В Oracle можно получить доступ к системным привилегиям следующим образом:

SQL
Скопировать код
SELECT privilege 
FROM dba_sys_privs 
WHERE grantee = 'USERNAME';

Замените 'USERNAME' на имя пользователя, которое вас интересует. Не забывайте про объектные прямые привилегии, привилегии на основе ролей и привилегии на уровне столбцов, чтобы составить полный список.

Кинга Идем в IT: пошаговый план для смены профессии

Подход "показать мне все"

Прямые системные и объектные разрешения

Чтобы извлечь системные привилегии пользователя, обратитесь к dba_sys_privs:

SQL
Скопировать код
-- Всегда хочется ещё!
SELECT * 
FROM dba_sys_privs 
WHERE grantee = 'USERNAME';

Прямые разрешения на таблицы или представления можно запросить через dba_tab_privs:

SQL
Скопировать код
-- Разрешения острые как чили
SELECT * 
FROM dba_tab_privs 
WHERE grantee = 'USERNAME';

Разрешения на основе ролей – это важно!

Роли включают набор разрешений. Чтобы их просмотреть, воспользуйтесь:

SQL
Скопировать код
-- Проверим все ли роли на месте?
SELECT * 
FROM dba_role_privs 
WHERE grantee = 'USERNAME';

Для просмотра системных привилегий, связанных с этими ролями, используйте запрос:

SQL
Скопировать код
-- У ролей тоже есть свои привилегии
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:

SQL
Скопировать код
-- Этот запрос – ваш центр управления
SELECT * 
FROM all_tab_privs_recd 
WHERE grantee = 'USERNAME';

Не забывайте, что all_tab_privs_recd может несодержать информацию о временных таблицах.

DBMS_METADATA, мой новый друг

С помощью пакета DBMS_METADATA в Oracle можно получить все сразу, как на шведском столе:

SQL
Скопировать код
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' на реальное имя пользователя и учтите использование регистра.

Преобразование данных

Обратите внимание на возможные дубликаты, чтобы результаты запросов были четкими и организованными.

Визуализация

Представьте офисное здание (🏢) с различными уровнями безопасности:

Markdown
Скопировать код
👤 Пользователь: Алиса
🏢 Этажи здания: [Первый 🌍, Второй 🥇, Третий 🥈, Четвертый 🥉]

Список привилегий – это ваши карты доступа, выданные Алисе:

Markdown
Скопировать код
Первый 🌍 этаж: 🎟️ Доступ (SELECT)
Второй 🥇 этаж: 🚫 Доступ отсутствует
Третий 🥈 этаж: 🎟️ Доступ (UPDATE), 🎫 Все права (ADMIN PRIVILEGES)
Четвертый 🥉 этаж: 🎟️ Доступ (INSERT)

Навигация в неопределенностях

Анализ иерархии ролей

Для получения информации о привилегиях ролей и их иерархии используйте рекурсивный запрос:

SQL
Скопировать код
-- Дорога к ролям, где путь важнее конечной точки
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:

SQL
Скопировать код
-- Права на столбцы определяет не судьба, а запрос
SELECT grantee, table_name, column_name, privilege 
FROM dba_tab_privs 
WHERE grantee = 'USERNAME'
AND column_name IS NOT NULL;

Выключаем стандартные схемы

Чтобы сфокусироваться на привилегиях пользователя, исключите стандартные схемы:

SQL
Скопировать код
-- SYS и SYSTEM идут в сторонку, мы сосредотачиваемся на пассиве
SELECT * 
FROM dba_tab_privs 
WHERE grantee != 'SYS' AND grantee != 'SYSTEM' AND grantee = 'USERNAME';

Полезные материалы

  1. MySQL :: Руководство по MySQL 8.0 :: 13.7.7.21 Выражение SHOW GRANTS
  2. GRANT
  3. PostgreSQL: Документация: 16: 9.26. Функции и операторы системной информации
  4. GRANT Server Permissions (Transact-SQL) – SQL Server | Microsoft Learn
  5. SHOW GRANTS – База знаний MariaDB
  6. Как Создать Нового Пользователя и Назначить Права в MySQL | DigitalOcean