ACCESS в Oracle SQL. Введение
ACCESS в Oracle SQL не является оператором в классическом смысле, но используется в системных представлениях и трассировке запросов для анализа доступа к объектам базы данных. Оно встречается, например, в представлениях V$ACCESS, DBA_TAB_PRIVS, DBA_OBJECTS, а также может использоваться при изучении планов выполнения запросов. В этой статье ты найдёшь 45 примеров, где встречается ACCESS, и как с ним работать.
🖋️ Где встречается ключевое слово ACCESS
-- В системной таблице V$ACCESS:
SELECT * FROM V$ACCESS;
-- В представлении с правами доступа:
SELECT * FROM DBA_TAB_PRIVS WHERE PRIVILEGE = 'SELECT';
- V$ACCESS показывает, какие объекты и кем используются
- Используется в планах выполнения (EXPLAIN PLAN)
- Связан с управлением привилегиями и доступом
- Не используется как самостоятельный SQL-оператор
🔄 Где используется ACCESS в Oracle SQL
- Мониторинг текущего доступа пользователей
- Аудит и безопасность
- Управление правами и привилегиями
- Диагностика производительности и блокировок
📊 Примеры использования ACCESS в Oracle SQL
- Список активных объектов в V$ACCESS:
SELECT * FROM V$ACCESS;
- Фильтрация по пользователю:
SELECT * FROM V$ACCESS WHERE USERNAME = 'HR';
- Проверка доступа к конкретному объекту:
SELECT * FROM V$ACCESS WHERE OBJECT = 'EMPLOYEES';
- Мониторинг текущего сеанса:
SELECT * FROM V$ACCESS WHERE SID = SYS_CONTEXT('USERENV', 'SID');
- Подсчёт количества блокировок:
SELECT OBJECT, COUNT(*) AS cnt FROM V$ACCESS GROUP BY OBJECT;
- Просмотр всех объектов, используемых текущей сессией:
SELECT * FROM V$ACCESS WHERE SID = SYS_CONTEXT('USERENV', 'SID');
- Получение уникальных пользователей:
SELECT DISTINCT USERNAME FROM V$ACCESS;
- Фильтрация по объекту и пользователю:
SELECT * FROM V$ACCESS WHERE OBJECT = 'EMPLOYEES' AND USERNAME = 'HR';
- Сортировка по имени объекта:
SELECT * FROM V$ACCESS ORDER BY OBJECT;
- Объекты, к которым обращается более одного пользователя:
SELECT OBJECT FROM V$ACCESS GROUP BY OBJECT HAVING COUNT(DISTINCT USERNAME) > 1;
- Привязка к конкретному SID:
SELECT * FROM V$ACCESS WHERE SID = 123;
- Сессии, которые блокируют объекты:
SELECT SID, OBJECT FROM V$ACCESS WHERE OBJECT IN (
SELECT OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_TYPE = 'TABLE'
);
- Проверка доступа к таблицам схемы:
SELECT * FROM V$ACCESS WHERE OBJECT IN (
SELECT OBJECT_NAME FROM ALL_OBJECTS WHERE OWNER = 'SCOTT'
);
- Агрегация по пользователю:
SELECT USERNAME, COUNT(*) AS accesses FROM V$ACCESS GROUP BY USERNAME;
- Мониторинг конкретной таблицы:
SELECT * FROM V$ACCESS WHERE OBJECT = 'ORDERS';
- Использование в подзапросе:
SELECT * FROM V$SESSION
WHERE SID IN (SELECT SID FROM V$ACCESS WHERE OBJECT = 'EMPLOYEES');
- Сессии, работающие с несколькими объектами:
SELECT SID FROM V$ACCESS GROUP BY SID HAVING COUNT(*) > 1;
- Запрос со временем последнего доступа:
SELECT a.SID, s.LAST_CALL_ET
FROM V$ACCESS a JOIN V$SESSION s ON a.SID = s.SID;
- Динамическое построение списка активных объектов:
SELECT DISTINCT OBJECT FROM V$ACCESS;
- Сравнение доступа двух пользователей:
SELECT OBJECT FROM V$ACCESS WHERE USERNAME IN ('HR', 'SCOTT')
GROUP BY OBJECT HAVING COUNT(DISTINCT USERNAME) = 2;
- Проверка доступа через DBA_OBJECTS:
SELECT a.*
FROM V$ACCESS a JOIN DBA_OBJECTS o
ON a.OBJECT = o.OBJECT_NAME
WHERE o.OBJECT_TYPE = 'TABLE';
- Объекты, доступные всем текущим сессиям:
SELECT OBJECT FROM V$ACCESS GROUP BY OBJECT HAVING COUNT(*) = (
SELECT COUNT(*) FROM V$SESSION
);
- Фильтрация по объектам типа VIEW:
SELECT * FROM V$ACCESS
WHERE OBJECT IN (
SELECT OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_TYPE = 'VIEW'
);
- Объекты, доступ к которым имеет SYS:
SELECT * FROM V$ACCESS WHERE USERNAME = 'SYS';
- Использование INSTR для поиска:
SELECT * FROM V$ACCESS WHERE INSTR(OBJECT, 'EMP') > 0;
- Отображение уникальных связок USERNAME-OBJECT:
SELECT DISTINCT USERNAME, OBJECT FROM V$ACCESS;
- Анализ доступа по времени активности:
SELECT a.OBJECT, s.LOGON_TIME
FROM V$ACCESS a JOIN V$SESSION s ON a.SID = s.SID;
- Работа с представлением GV$ACCESS в RAC:
SELECT * FROM GV$ACCESS WHERE INST_ID = 1;
- Подсчёт количества уникальных объектов:
SELECT COUNT(DISTINCT OBJECT) FROM V$ACCESS;
- Получение SID по объекту:
SELECT SID FROM V$ACCESS WHERE OBJECT = 'DEPARTMENTS';
- Мониторинг с использованием EXPLAIN PLAN:
EXPLAIN PLAN FOR SELECT * FROM employees;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
- Проверка блокировки таблицы:
SELECT a.SID, l.LOCK_TYPE
FROM V$ACCESS a JOIN V$LOCK l ON a.SID = l.SID;
- Вложенный запрос по сессиям:
SELECT s.SID, s.SERIAL#
FROM V$SESSION s
WHERE s.SID IN (SELECT SID FROM V$ACCESS);
- Работа с ALL_OBJECTS для расширенного анализа:
SELECT a.OBJECT, o.STATUS FROM V$ACCESS a JOIN ALL_OBJECTS o ON a.OBJECT = o.OBJECT_NAME;
- Подключение к SQL Developer и запуск:
-- Просто открой Worksheet и выполни:
SELECT * FROM V$ACCESS;
- Объекты, к которым обращались чаще всего:
SELECT OBJECT, COUNT(*) AS usage FROM V$ACCESS GROUP BY OBJECT ORDER BY usage DESC;
- Список SID по конкретному пользователю:
SELECT SID FROM V$ACCESS WHERE USERNAME = 'SYSTEM';
- Агрегация по количеству объектов на сессию:
SELECT SID, COUNT(DISTINCT OBJECT) AS obj_count FROM V$ACCESS GROUP BY SID;
- Сессии с доступом к одной и той же таблице:
SELECT SID FROM V$ACCESS WHERE OBJECT = 'CUSTOMERS';
- Триггер с использованием V$ACCESS:
CREATE OR REPLACE TRIGGER trg_audit_access
AFTER INSERT ON some_table
BEGIN
INSERT INTO audit_log(event_type, object)
SELECT 'access', OBJECT FROM V$ACCESS WHERE SID = SYS_CONTEXT('USERENV', 'SID');
END;
- Использование SYS_CONTEXT с ACCESS:
SELECT * FROM V$ACCESS WHERE USERNAME = SYS_CONTEXT('USERENV', 'SESSION_USER');
- Проверка блокировок через V$ACCESS:
SELECT a.SID, l.TYPE FROM V$ACCESS a
JOIN V$LOCK l ON a.SID = l.SID;
- Удаление сессии по SID:
ALTER SYSTEM KILL SESSION 'SID,SERIAL#';
- Использование V$ACCESS в хранимой процедуре:
CREATE OR REPLACE PROCEDURE log_current_access IS
BEGIN
INSERT INTO audit_log(event_type, object)
SELECT 'log', OBJECT FROM V$ACCESS;
END;
- Получение объектов текущей схемы:
SELECT * FROM V$ACCESS WHERE USERNAME = USER;
📆 Заключение: зачем знать про ACCESS в Oracle SQL
ACCESS — это важная составляющая системной диагностики в Oracle. Оно позволяет отслеживать, кто и когда обращается к объектам, помогает в аудите и управлении безопасностью. Хотя ACCESS не используется как SQL-оператор, его значение в анализе и мониторинге невозможно переоценить.
🕸️ Следующая статья:
DROP в Oracle SQL — как безопасно удалять таблицы, индексы и другие объекты