Service Trigger. Триггеры для служб.

16 Янв 2013 | Автор: | Комментарий один »

И снова здравсвуйте друзья!!!

В своей статье я хочу рассказать о службах, которые запускаются через триггер (trigger start service)- это новая функция, которая впервые появилась в ВИНДОУС СЕМЬ.

По большому счету, службы, которые запускаются по триггеру в ВИНДОУС СЕМЬ – это обычные службы, которые вы можите настроить на остановку либо запуск по наступлению какого-то события (это может быть доступность ip адреса , открытие порта, и т.д.). Перечисляю доступные триггеры, которые можно использовать для настройки запуска служб в ВИНДОУС СЕМЬ Service Trigger:Открытие или закрытие порта на брандмауэре Подключение или отключение устройства Вход либо выход из домена Доступность или недоступность определенного ip адреса Изменение в групповых политиках Настраиваемое событие – при помощи программного интерфейса виндоус ETW Зачем же понадобился механизм служб, которые запускаеются по триггеру в ВИНДОУС СЕМЬ /2008 r2? Службы, запускаемые по триггеру необходимы для: 1) Оптимизации использования системных ресурсов и увеличения быстродействия системы.

Ведь любая служба, которая запущена (даже пусть она работает в фоновом режиме) будет потреблять ресурсы CPU и памяти, тогда зачем же вы будете тратить драгоценные ресурсы для служб, которые в данный момент вам не нужны? 2) Экономим электроэнергию. Так же как и в первом пункте речь пойдет об уменьшении загрузки на CPU, и следствием этого является уменьшения потребления электроэнергии (это особенно актуально для переносных устройств: планшетов, ноутбуков, нетбуков) 3) Увеличевает стабильность работы системы за счет уменьшения количества постоянно запущенных процессов (имеется в виду вероятные утеки памяти в службах) Познакомимся с технологией Service Trigger в ВИНДОУС СЕМЬ поближе. В качестве примера берем службу «Computer Browser» (Обозреватель сети), она настроена на ручной (manual) запуск по умолчанию , однако, она запущена в настоящий момент . Открываем командную строку и набираем следующую команду в ней: SC qtriggerinfo BROWSER После того, как эта команда выполнена вы можите увидеть, что сервисный триггер настроен для службы Computer Browser. Служба Computer Browser будет запущена только после того, как будут открыты следующие порты в брандмауэре ( 137 UDP, 138 UDP,139 TCP), и отключится сразу, как только будут закрыты указанные порты.

Свою статью я пишу на своем ноутбуке, который подключен с помощью Wireless LAN к интернету, поэтому, если я выключу свое беспроводное соединение, любой сетевой трафик через брандмауэр должен перестать проходить, и должна отключиться служба Computer Browser автоматически. И точно, через 60 секунд после того, как я отключила Wireless LAN, отключилась служба «Обозревателя сети» . Затем я снова активировала мое беспроводное подключение, и результатом стало срабатывание триггера службы Computer Browser, она снова запустилась.

Попробуем просмотреть информацию о триггерах другой сетевой службы, DHCP: SC qtriggerinfo DHCP Как вы сможите увидить, для этой службы ни одного заданного триггера нет. Выполняем триггеры в определенном порядке Проблема эта известная. У меня есть 2 триггера, они отработать должны в предопределенном порядке, т.е. триггер A сначала, а затем отработать триггер B. Почему не иметь один триггер, который объединил бы триггеры A и B вединый триггер AB? Хороший вопрос. К сожалению, используется триггер Aдля репликации, а более поздний триггер - .ТО не для репликации, это определяет наличие двух триггеров именно.

Создадим испытательную среду. Понадобятся 2 таблицы. 1-для написания и тестирования триггеров, а 2 - для журнализации триггера и время его выполнения. CREATE TABLE[Trigger Priority] ( [Id] [int] IDENTITY (1, 1) NOT NULL , [First] [int] NULL , [Second] [int] NULL , [Last] [int] NULL , [Status] [char] (1) NULL ) ON [PRIMARY] GO Один триггер – триггер на вставку, он будет некоторым случайным числом обновлять столбец First. Триггер называться будет trg_UpdateFirst CREATE TRIGGER trg_UpdateFirst ON dbo.[Trigger Priority] FOR INSERT AS declare @id int,@val as float Select @id=id from inserted select @val=floor(rand() * 10) Updat [Trigger Priority]set[First]=@val Where ID=@id Insert into TriggerLog (TriggerName) values ('trg_UpdateFirst') Последняя строчка триггера журнализирует имя триггера и время срабатывания в таблице TriggerLog. Следующий триггер будет использоваться ЧТОБ обновИТЬ столбЕЦ Second значением с столбца First. CREATE TRIGGER trg_UpdateSecond ON dbo.[Trigger Priority] FOR INSERT AS declare @id int Select @id=id from inserted Update [Trigger Priority]set[Second]=First]Where ID=@id Insert into TriggerLog(TriggerName) values('trg_UpdateSecond') Используется последний триггер для обновления столбца Last суммой значений столбца First и Second. CREATE TRIGGER trg_UpdateLast ON dbo.[Trigger Priority] FOR INSERT AS declare @id int Select @id=id from inserted Update[Trigger Priority]se [Last]=[First +[Second]Where ID =@id Insert into TriggerLog(TriggerName) values('trg_UpdateLast') Чтоб получить ожидаемые результаты, триггеры trg_UpdateFisrt и trg_UpdateSecond и trg_UpdateLast должны в вышеперечисленном порядке выполняться. Какой будет порядок? Посмотрим, что произходит. После вставки в таблицу одной записи [Trigger Priority] первый столбец содержит 5, что нормально, и второй тоже - 5, это тоже правильно. Но находится в последнем столбце NULL! Почему? Давайте проверим таблицу TriggerLog. Порядок столбцов - trg_UpdateLast и trg_UpdateFirst и trg_UpdateSecond.

 

После небольшого исследования выясняем, что выполняются триггеры в том порядке, в котором созданы они были. Т. о., триггеры надо в таком порядке создавать: trg_UpdateFirst, trg_UpdateSecond и trg_UpdateLast. Это не является простой задачей. Другой вопрос. Как Вы собираетесь узнать на более поздней стадии о порядке срабатывания триггеров? select*from sysobjects where xType='TR"order by id С помощью этого запроса можете идентифицировать порядок, в котором триггеры выполнятся. Установить порядок Естьхранимая системная процедура, существует, чтоб на подобный вопрос ответить. Эта хранимая процедура- sp_settriggerorder. У SP есть три параметра. sp_settriggerorder [@triggername =] 'triggername' , [@order =] 'значение' , [@stmttype =] 'statement_type' 1ый параметр - имя триггера, а 2ой параметр - порядок. Этот порядок принимать одно из трех значений может: First, None, и Last. Последний параметр собой представляет тип триггера, т.е. Insert, Update либо Delete. Это значит, что нельзя позволить себе иметь 5 триггеров одного типа, которые выполнялись бы в определенном порядке. Это вряд ли в практике встречается. Этот порядок установлен не может быть опциями Alter Trigger либо Create Trigger. Если изменяет первый или последний триггер оператор Alter Trigger, то установленные первоначально на триггере атрибуты First - Last удалятся, и заменяется значение на None.

Значение порядка должно переустановитсяпри помощи хранимой процедуры sp_settriggerorder. Разрешения Владелец таблицы, на которой определен триггер и триггера есть разрешение на выполнение sp_settriggerorder. Члены ролей db_owner а так же db_ddladmin в базе данных, и серверная роль sysadmin, могут эту хранимую процедуру выполнять. Получение порядка Проблема заключается в установлении порядка, в котором триггеры выполняются, на более поздней стадии. Нет прямого способа эту информацию из Enterprise Manager SQL Server получить. Вместо этого простые запросы пишете. select objectproperty(object_id(' trg_UpdateFirst'), 'ExecIsFirstInsertTrigger')ExecIsFirstInsertTrigger') укажит, является ли триггером на вставку trg_UpdateFirst первым (First)?

Надеюсь все понятно всем на этом все покидаю Вас пока...

Метки записи: , ,

Комментарии к записи " Service Trigger. Триггеры для служб."

Посмотреть последние комментарии
  1. В целом здравая идея, которая, навскидку, не имеет никаких отрицательных моментов. Не исключено, что использование запусков по триггерам ведёт к некоторому подтормаживанию конкретной службы, но оно будет таким незначительным да и только при старте службы, так что им можно и пренебречь: сомневаюсь, что через триггеры будут запускаться службы которые работают в, скажем так, "пульсирующем" ритме - старт, остановка, старт, остановка, снова старт.
    А экономия батареи не повредит...

Здесь вы можете написать комментарий к записи "Service Trigger. Триггеры для служб.".

* Обязательные для заполнения поля
Все отзывы проходят модерацию.
Мы в VK
Наши партнеры
Читать нас
Связаться с нами
Наши контакты

info@windowsfan.ru

О сайте

Информационно-познавательный интернет журнал про Windows