ACCOUNT_STATUS в Oracle SQL. Введение
ACCOUNT_STATUS — это столбец в представлении DBA_USERS, который показывает текущее состояние учётной записи пользователя в Oracle Database. Он используется администраторами для мониторинга, безопасности и управления доступом. Значения могут быть: OPEN, LOCKED, EXPIRED, LOCKED(TIMED), EXPIRED & LOCKED и др. В этой статье ты найдёшь 50 примеров использования ACCOUNT_STATUS в Oracle SQL.
🖋️ Синтаксис и применение ACCOUNT_STATUS
-- Базовый запрос:
SELECT username, account_status FROM dba_users;
-- Фильтрация по статусу:
SELECT * FROM dba_users WHERE account_status != 'OPEN';
🔄 Где используется ACCOUNT_STATUS
- Проверка активных/заблокированных учётных записей
- Безопасность и аудит
- Автоматизация разблокировки/удаления
- Контроль доступа к базе
📊 45 примеров использования ACCOUNT_STATUS в Oracle SQL
- Список всех пользователей и их статусов:
SELECT username, account_status FROM dba_users;
- Заблокированные пользователи:
SELECT username FROM dba_users WHERE account_status LIKE 'LOCKED%';
- Истёкшие и заблокированные:
SELECT username FROM dba_users WHERE account_status = 'EXPIRED & LOCKED';
- Только активные:
SELECT username FROM dba_users WHERE account_status = 'OPEN';
- Группировка по статусам:
SELECT account_status, COUNT(*) FROM dba_users GROUP BY account_status;
- Пользователи с истёкшими паролями:
SELECT username FROM dba_users WHERE account_status LIKE 'EXPIRED%';
- Пользователи, которых нужно разблокировать:
SELECT username FROM dba_users WHERE account_status = 'LOCKED';
- Количество пользователей по каждому статусу:
SELECT account_status, COUNT(*) AS count FROM dba_users GROUP BY account_status;
- Проверка, есть ли отключённые пользователи:
SELECT * FROM dba_users WHERE account_status = 'EXPIRED & LOCKED';
- Поиск по маске ‘EXPIRED’:
SELECT username, account_status FROM dba_users WHERE account_status LIKE 'EXPIRED%';
- Найти пользователей с многократными блокировками:
SELECT username FROM dba_users WHERE account_status IN ('LOCKED', 'LOCKED(TIMED)');
- Отсортировать пользователей по статусу:
SELECT username, account_status FROM dba_users ORDER BY account_status;
- Получить пользователей в статусе ‘EXPIRED’:
SELECT username FROM dba_users WHERE account_status = 'EXPIRED';
- Пользователи с временной блокировкой:
SELECT username FROM dba_users WHERE account_status = 'LOCKED(TIMED)';
- Поиск всех пользователей, кроме активных:
SELECT username FROM dba_users WHERE account_status != 'OPEN';
- Получить список всех заблокированных аккаунтов:
SELECT * FROM dba_users WHERE account_status LIKE '%LOCKED%';
- Пользователи, нуждающиеся в сбросе пароля:
SELECT username FROM dba_users WHERE account_status = 'EXPIRED';
- Объединение с DBA_PROFILES:
SELECT u.username, u.account_status, p.profile
FROM dba_users u JOIN dba_profiles p ON u.profile = p.profile;
- Проверка статуса конкретного пользователя:
SELECT account_status FROM dba_users WHERE username = 'SCOTT';
- Автоматическое уведомление через SELECT:
SELECT 'User ' || username || ' is ' || account_status AS status_msg
FROM dba_users;
- Пользователи, созданные недавно и заблокированные:
SELECT username, created FROM dba_users
WHERE account_status != 'OPEN' AND created > SYSDATE - 30;
- Группировка по статусу с процентами:
SELECT account_status, COUNT(*) * 100 / (SELECT COUNT(*) FROM dba_users) AS percentage
FROM dba_users GROUP BY account_status;
- Количество заблокированных пользователей по профилям:
SELECT profile, COUNT(*) FROM dba_users
WHERE account_status LIKE 'LOCKED%'
GROUP BY profile;
- Просмотр пользователей с неудачными логинами:
SELECT username FROM dba_users
WHERE account_status = 'LOCKED(TIMED)';
- Найти пользователей с устаревшими статусами:
SELECT username FROM dba_users WHERE account_status NOT IN ('OPEN', 'LOCKED');
- Использование в подзапросе:
SELECT * FROM some_audit_table
WHERE user_id IN (SELECT username FROM dba_users WHERE account_status != 'OPEN');
- Использование в аналитике:
SELECT username, account_status,
RANK() OVER (PARTITION BY account_status ORDER BY created DESC) AS rnk
FROM dba_users;
- Вывод статуса + дата создания:
SELECT username, account_status, created FROM dba_users;
- Отчёт по заблокированным пользователям:
SELECT username FROM dba_users WHERE account_status IN ('LOCKED', 'LOCKED(TIMED)');
- Отображение иерархии прав + статус:
SELECT u.username, r.granted_role, u.account_status
FROM dba_users u JOIN dba_role_privs r ON u.username = r.grantee;
- Проверка статуса пользователей в конкретной схеме:
SELECT * FROM dba_users WHERE default_tablespace = 'USERS' AND account_status != 'OPEN';
- Отчёт в формате JSON:
SELECT JSON_OBJECT('user' VALUE username, 'status' VALUE account_status)
FROM dba_users;
- Создание представления с активными пользователями:
CREATE VIEW active_users AS
SELECT username FROM dba_users WHERE account_status = 'OPEN';
- Использование в MERGE для обновления мониторинга:
MERGE INTO audit_status a
USING (SELECT username, account_status FROM dba_users) d
ON (a.username = d.username)
WHEN MATCHED THEN UPDATE SET a.status = d.account_status;
- Информация об активности и статусе:
SELECT u.username, u.account_status, s.status
FROM dba_users u JOIN v$session s ON u.username = s.username;
- Подготовка списка для восстановления доступа:
SELECT username FROM dba_users WHERE account_status IN ('EXPIRED', 'EXPIRED & LOCKED');
- Использование в триггере для аудита:
CREATE OR REPLACE TRIGGER trg_account_audit
AFTER UPDATE ON dba_users
BEGIN
INSERT INTO audit_log(event, details)
VALUES ('status_change', USER || ' updated ');
END;
- Удаление неактивных пользователей:
DELETE FROM custom_user_table
WHERE username IN (SELECT username FROM dba_users WHERE account_status = 'LOCKED');
- Вызов в хранимой процедуре:
CREATE PROCEDURE print_locked_users IS
BEGIN
FOR r IN (SELECT username FROM dba_users WHERE account_status != 'OPEN')
LOOP
DBMS_OUTPUT.PUT_LINE(r.username);
END LOOP;
END;
- Использование в CTE:
WITH expired_users AS (
SELECT username FROM dba_users WHERE account_status = 'EXPIRED'
)
SELECT * FROM expired_users;
- Работа с логикой CASE:
SELECT username,
CASE
WHEN account_status = 'OPEN' THEN 'Active'
ELSE 'Restricted'
END AS status_label
FROM dba_users;
- Проверка через ALL_USERS (ограничено):
SELECT username FROM all_users
WHERE username NOT IN (SELECT username FROM dba_users WHERE account_status = 'OPEN');
- Сравнение со списком логинов:
SELECT login_user FROM app_logins
WHERE login_user IN (SELECT username FROM dba_users WHERE account_status != 'OPEN');
- Поиск пользователей без активности:
SELECT u.username FROM dba_users u
LEFT JOIN v$session s ON u.username = s.username
WHERE s.username IS NULL AND u.account_status != 'OPEN';
- Фильтрация временно заблокированных:
SELECT username FROM dba_users WHERE account_status = 'LOCKED(TIMED)';
📆 ACCOUNT_STATUS в Oracle SQL. Заключение
ACCOUNT_STATUS — важный инструмент администратора базы данных. Он позволяет оперативно отслеживать состояние учётных записей, выявлять заблокированные и истёкшие аккаунты и предпринимать действия по управлению ими. Регулярная проверка ACCOUNT_STATUS — ключ к безопасности.
🕸️ Следующая статья:
ZONE_OFFSET в Oracle SQL — как узнать смещение временной зоны