ACCOUNT_STATUS в Oracle SQL — состояние пользователя

🟢 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

  1. Список всех пользователей и их статусов:
SELECT username, account_status FROM dba_users;
  1. Заблокированные пользователи:
SELECT username FROM dba_users WHERE account_status LIKE 'LOCKED%';
  1. Истёкшие и заблокированные:
SELECT username FROM dba_users WHERE account_status = 'EXPIRED & LOCKED';
  1. Только активные:
SELECT username FROM dba_users WHERE account_status = 'OPEN';
  1. Группировка по статусам:
SELECT account_status, COUNT(*) FROM dba_users GROUP BY account_status;
  1. Пользователи с истёкшими паролями:
SELECT username FROM dba_users WHERE account_status LIKE 'EXPIRED%';
  1. Пользователи, которых нужно разблокировать:
SELECT username FROM dba_users WHERE account_status = 'LOCKED';
  1. Количество пользователей по каждому статусу:
SELECT account_status, COUNT(*) AS count FROM dba_users GROUP BY account_status;
  1. Проверка, есть ли отключённые пользователи:
SELECT * FROM dba_users WHERE account_status = 'EXPIRED & LOCKED';
  1. Поиск по маске ‘EXPIRED’:
SELECT username, account_status FROM dba_users WHERE account_status LIKE 'EXPIRED%';
  1. Найти пользователей с многократными блокировками:
SELECT username FROM dba_users WHERE account_status IN ('LOCKED', 'LOCKED(TIMED)');
  1. Отсортировать пользователей по статусу:
SELECT username, account_status FROM dba_users ORDER BY account_status;
  1. Получить пользователей в статусе ‘EXPIRED’:
SELECT username FROM dba_users WHERE account_status = 'EXPIRED';
  1. Пользователи с временной блокировкой:
SELECT username FROM dba_users WHERE account_status = 'LOCKED(TIMED)';
  1. Поиск всех пользователей, кроме активных:
SELECT username FROM dba_users WHERE account_status != 'OPEN';
  1. Получить список всех заблокированных аккаунтов:
SELECT * FROM dba_users WHERE account_status LIKE '%LOCKED%';
  1. Пользователи, нуждающиеся в сбросе пароля:
SELECT username FROM dba_users WHERE account_status = 'EXPIRED';
  1. Объединение с DBA_PROFILES:
SELECT u.username, u.account_status, p.profile
FROM dba_users u JOIN dba_profiles p ON u.profile = p.profile;
  1. Проверка статуса конкретного пользователя:
SELECT account_status FROM dba_users WHERE username = 'SCOTT';
  1. Автоматическое уведомление через SELECT:
SELECT 'User ' || username || ' is ' || account_status AS status_msg
FROM dba_users;
  1. Пользователи, созданные недавно и заблокированные:
SELECT username, created FROM dba_users
WHERE account_status != 'OPEN' AND created > SYSDATE - 30;
  1. Группировка по статусу с процентами:
SELECT account_status, COUNT(*) * 100 / (SELECT COUNT(*) FROM dba_users) AS percentage
FROM dba_users GROUP BY account_status;
  1. Количество заблокированных пользователей по профилям:
SELECT profile, COUNT(*) FROM dba_users
WHERE account_status LIKE 'LOCKED%'
GROUP BY profile;
  1. Просмотр пользователей с неудачными логинами:
SELECT username FROM dba_users
WHERE account_status = 'LOCKED(TIMED)';
  1. Найти пользователей с устаревшими статусами:
SELECT username FROM dba_users WHERE account_status NOT IN ('OPEN', 'LOCKED');
  1. Использование в подзапросе:
SELECT * FROM some_audit_table
WHERE user_id IN (SELECT username FROM dba_users WHERE account_status != 'OPEN');
  1. Использование в аналитике:
SELECT username, account_status,
  RANK() OVER (PARTITION BY account_status ORDER BY created DESC) AS rnk
FROM dba_users;
  1. Вывод статуса + дата создания:
SELECT username, account_status, created FROM dba_users;
  1. Отчёт по заблокированным пользователям:
SELECT username FROM dba_users WHERE account_status IN ('LOCKED', 'LOCKED(TIMED)');
  1. Отображение иерархии прав + статус:
SELECT u.username, r.granted_role, u.account_status
FROM dba_users u JOIN dba_role_privs r ON u.username = r.grantee;
  1. Проверка статуса пользователей в конкретной схеме:
SELECT * FROM dba_users WHERE default_tablespace = 'USERS' AND account_status != 'OPEN';
  1. Отчёт в формате JSON:
SELECT JSON_OBJECT('user' VALUE username, 'status' VALUE account_status)
FROM dba_users;
  1. Создание представления с активными пользователями:
CREATE VIEW active_users AS
SELECT username FROM dba_users WHERE account_status = 'OPEN';
  1. Использование в 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;
  1. Информация об активности и статусе:
SELECT u.username, u.account_status, s.status
FROM dba_users u JOIN v$session s ON u.username = s.username;
  1. Подготовка списка для восстановления доступа:
SELECT username FROM dba_users WHERE account_status IN ('EXPIRED', 'EXPIRED & LOCKED');
  1. Использование в триггере для аудита:
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;
  1. Удаление неактивных пользователей:
DELETE FROM custom_user_table
WHERE username IN (SELECT username FROM dba_users WHERE account_status = 'LOCKED');
  1. Вызов в хранимой процедуре:
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;
  1. Использование в CTE:
WITH expired_users AS (
  SELECT username FROM dba_users WHERE account_status = 'EXPIRED'
)
SELECT * FROM expired_users;
  1. Работа с логикой CASE:
SELECT username,
  CASE
    WHEN account_status = 'OPEN' THEN 'Active'
    ELSE 'Restricted'
  END AS status_label
FROM dba_users;
  1. Проверка через ALL_USERS (ограничено):
SELECT username FROM all_users
WHERE username NOT IN (SELECT username FROM dba_users WHERE account_status = 'OPEN');
  1. Сравнение со списком логинов:
SELECT login_user FROM app_logins
WHERE login_user IN (SELECT username FROM dba_users WHERE account_status != 'OPEN');
  1. Поиск пользователей без активности:
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';
  1. Фильтрация временно заблокированных:
SELECT username FROM dba_users WHERE account_status = 'LOCKED(TIMED)';

📆 ACCOUNT_STATUS в Oracle SQL. Заключение

ACCOUNT_STATUS — важный инструмент администратора базы данных. Он позволяет оперативно отслеживать состояние учётных записей, выявлять заблокированные и истёкшие аккаунты и предпринимать действия по управлению ими. Регулярная проверка ACCOUNT_STATUS — ключ к безопасности.


🕸️ Следующая статья:

ZONE_OFFSET в Oracle SQL — как узнать смещение временной зоны


 

Понравилась статья? Поделиться с друзьями:
5 1 голос
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии