Фев 242011
 

Вот пример триггера, в котором устанавливается ограничение на количество сессий, открытых одновременно и удовлетворяющих определённому условию (в дополнение к этому посту):

CREATE OR REPLACE TRIGGER deny_logon_condition
	AFTER LOGON ON DATABASE
DECLARE
	current_count NUMBER;
	login_count NUMBER;
BEGIN	
	-- Узнаем, подходит ли наша сессия под условия ADDITIONAL_CONDITIONS
	SELECT COUNT(*)
	INTO current_count
	FROM sys.v_$session
	WHERE TYPE != 'BACKGROUND'
		AND audsid = USERENV('sessionid')
		AND ROWNUM = 1
		AND ( ADDITIONAL_CONDITIONS );
 
	-- Посчитаем количество сессий, подходящих под это условие
	SELECT COUNT(*)
	INTO login_count
	FROM sys.v_$session
	WHERE TYPE != 'BACKGROUND'
		AND ( ADDITIONAL_CONDITIONS );
 
	-- Если их больше 4-х и наша сессия тоже удовлетворяет условию,
	-- то не дадим соединиться.
	IF ((login_count > 4) AND (current_count = 1)) THEN
	   RAISE_APPLICATION_ERROR(-20001, 'Too many sessions for this type of session');
	END IF;
 
	-- Это нужно, чтобы подавить исключение, которое 
	-- возникнет в 1-м блоке, если наша сессия не подойдёт под условие.
	EXCEPTION WHEN NO_DATA_FOUND THEN NULL;
END;
/

Здесь ADDITIONAL_CONDITIONS - те самые условия. Это может быть фильтрация по полю program, osuser, module, machine, etc., например: UPPER(program) = 'SQLPLUSW'
При попытке открытия сессии, пользователь получит сообщение об ошибке, а мы можем время от времени проверять alert log на предмет наличия подобных попыток и ругаться вежливо напоминать пользователям, что нельзя открывать слишком много сессий такого типа.

При отладке триггера столкнулся с неприятной ситуацией : процедура RAISE_APPLICATION_ERROR не действует, если триггер срабатывает на сессию от имени пользователя с правами dba. Сообщение об ошибке попадает в alert log, но сессия не завершается и никакой ошибки в клиентском приложении не возникает.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)