2017-01-27 23 views
0

Как написать инструкцию SELECT, которая «показывает все учетные записи пользователей», которые не вошли в базу данных более 180 дней? Моя цель - отменить роли учетных записей пользователей, которые не вошли в базу данных за 180 дней.Выберите учетные записи пользователей, не занесенных в базу данных за 180 дней для отзыва ролей

Другими словами, мне нужно найти роли, которые в настоящее время предоставляются текущим пользователям, которые не вошли в систему более 180 дней.

Я использую Oracle 11g.

спасибо.

+0

Вы уже разместили [вопрос, чтобы найти пользователей, которые не вошли в систему за последние 90 дней] (http://stackoverflow.com/questions/41829385/how-to-create-an-oracle-stored-procedure- to-lock-user-accounts-not-logged-on-d), поэтому вы уже знаете эту часть. Пожалуйста, отредактируйте вопрос о том, что у вас уже есть, и проясните часть, в которой вам нужна помощь. Думаю, вам нужен только способ поиска ролей, связанных с набором пользователей. – Aleksej

ответ

1

Для Oracle 12.1 и выше вы можете использовать:

select role 
from dba_roles 
where role not in (select granted_role 
        from dba_role_privs 
        where grantee in (select username 
             from dba_users 
             where username not in ('SYS', 'SYSTEM') 
              and last_login >= trunc(sysdate)-180 
             ) 
        ) 
; 

В Oracle 11 сокровенное подзапрос не будет работать, так как столбец last_login не существует в dba_users таблице. Заменить сокровенный подзапрос с

select username 
from dba_audit_trail 
where action_name = 'LOGON' 
    and username not in ('SYS', 'SYSTEM') 
    and timestamp >= trunc(sysdate) - 180 

Я проверил 12с версии, и она производит правильный вывод на моей машине; Я не тестировал версию 11g, так как у меня нет базы данных 11g для тестирования.

+0

Большое спасибо. Я преподаю себе Oracle, поэтому я приношу свои извинения за нецелевое подключение точек. – caa35