Oracle: время простоя, похоже, игнорируется - PullRequest
1 голос
/ 13 марта 2012

В моем понимании, создание профиля с установленным на idle_time определенным значением (в минутах) и создание пользователя с этим профилем должно вызывать статус SNIPED для сеанса этого пользователя, если он простаивает дольше, чем idle_time. Когда пользователь пытается выполнить запрос после того, как это произошло, он получает сообщение, что ему необходимо снова подключиться.

Первый вопрос: это правильно? Если да, то читайте дальше:

Я запускаю тестовый скрипт в sqlplus следующим образом (очевидно, без заполнителей):

connect system/<password>@<tns>
CREATE PROFILE test_profile LIMIT idle_time 1;
CREATE USER test_user PROFILE test_profile IDENTIFIED BY test_user;
GRANT CREATE SESSION TO test_user;
GRANT ALTER SESSION TO test_user;
GRANT SELECT ON <schema>.<table> TO test_user;
disconnect;
connect test_user/test_user@<tns>
SELECT * FROM <schema>.<table>;

Все работает до этого момента; окно sqlplus все еще открыто. Теперь я открываю дополнительное окно sqplus и подключаюсь, используя системную учетную запись, выполняя следующий запрос после некоторого выполнения других действий:

SELECT username, status, seconds_in_wait FROM v$session WHERE username = 'test_user';

Я получаю что-то вроде:

USERNAME  STATUS   SECONDS_IN_WAIT
--------- -------- ---------------
TEST_USER INACTIVE            1166

Почему статус не был установлен на SNIPED?

Очевидно, что если я выполню другой запрос из окна sqlplus test_user, я не получу сообщение с просьбой восстановить соединение.

1 Ответ

4 голосов
/ 13 марта 2012

Необходимо установить для параметра RESOURCE_LIMIT базы данных значение TRUE, чтобы ограничения ресурсов в профилях вступили в силу.Предполагая, что вы используете spfile (иначе пропустите часть scope = BOTH)

ALTER SYSTEM SET resource_limit = TRUE scope = BOTH 

Как только вы это сделаете, PMON должен начать снимать сеансы, которые превысили ваш IDLE_TIME, когда он просыпается каждые несколько минут.

...