Во-первых, я хочу отметить, что похоже, что вы пытаетесь воссоздать функциональность команды ALTER SYSTEM ENABLE RESTRICTED SESSION
.Вы можете использовать это вместо этого.
На тему вашего вопроса есть простой ответ, но он не очень хорош.
CREATE OR REPLACE TRIGGER logon_system_maintenance
AFTER LOGON on DATABASE
IS
system_is_connected varchar2(1) := 'N';
BEGIN
select 'Y' into system_is_connected
from v$session
where username = 'SYSTEM' and status = 'ACTIVE';
-- this will not prevent users with ADMINISTER DATABASE TRIGGER privilege from connecting
RAISE_APPLICATION_ERROR (-20001, 'SYSTEM user is performing maintenance, please try again later');
EXCEPTION
WHEN NO_DATA_FOUND THEN
null; -- system not connected, OK
WHEN OTHERS THEN
null; -- probably the user doesn't have permission to view V$SESSION!
-- should they be able to connect, or not?
END;
/
Проблема здесь в том, чточтобы проверить, подключен ли SYSTEM, пользователь, подключающийся, должен иметь возможность просматривать представление V $ SESSION, что означает, что ему нужна роль SELECT_CATALOG_ROLE
.Вероятно, большинство ваших пользователей не имеют этой роли, что означает, что у них нет разрешения даже проверять, подключена СИСТЕМА или нет!
По моему опыту, большинство приложений создают таблицу для хранения различных системных параметров (например, MY_PARAM_TABLE
) и добавляют параметр, который контролирует, могут ли пользователи входить в систему или нет (например, SYSTEM_MAINTENANCE = 'N'
).Затем, когда вы входите в систему как SYSTEM, вы устанавливаете этот флаг на Y, и триггер проверяет эту таблицу (к которой должны иметь доступ все пользователи) и запрещает доступ, пока вы не установите ее обратно на N.
Также сохраняйтеИмейте в виду, что вы не можете помешать пользователям DBA регистрироваться таким образом.