Типы триггеров
Триггеры на основе времени и события, описанные ниже, позволяют запускать задачи различными способами.
Триггеры планировщика задач 2.0
Следующие типы триггеров определяются перечислением TASK_TRIGGER_TYPE2 .
Триггер | Описание |
---|---|
Триггер событий (триггер на основе событий). Сведения о разработке скриптов см. в разделе EventTrigger. Сведения о разработке на C++ см. в разделе IEventTrigger. Сведения о разработке XML см. в разделе Элемент EventTrigger. | Запускает задачу при возникновении определенного системного события. |
Триггер времени (триггер на основе времени).Сведения о разработке сценариев см. в разделе TimeTrigger. Сведения о разработке на C++ см. в разделе ITimeTrigger. Сведения о разработке XML см. в разделе Элемент TimeTrigger. | Запускает задачу в определенную дату и время. |
Ежедневный триггер (триггер календаря на основе времени)Сведения о разработке сценариев см. в разделе DailyTrigger. Сведения о разработке на C++ см. в разделе IDailyTrigger. Сведения о разработке XML см. в разделе Элемент CalendarTrigger. | Запускает задачу в определенное время по ежедневному расписанию. Например, задача начинается в 8:00 каждый день или через день. |
Еженедельный триггер (триггер календаря на основе времени). Сведения о разработке сценариев см. в разделе WeeklyTrigger. Сведения о разработке на C++ см. в разделе IWeeklyTrigger. Сведения о разработке XML см. в разделе Элемент CalendarTrigger. | Запускает задачу в определенное время в еженедельном расписании. Например, задача начинается в 8:00 в определенный день недели каждую неделю или в определенный день недели каждую вторая неделя. |
Ежемесячный триггер (триггер календаря на основе времени). Сведения о разработке скриптов см. в разделе MonthlyTrigger. Сведения о разработке на C++ см. в разделе IMonthlyTrigger. Сведения о разработке XML см. в разделе Элемент CalendarTrigger. | Запускает задачу в определенное время по ежемесячному расписанию. Например, задача начинается в 8:00 в определенные дни месяца для определенных месяцев. |
Триггер ежемесячного дня недели (dow) (триггер календаря на основе времени).Сведения о разработке сценариев см. в разделе MonthlyDOWTrigger. Сведения о разработке на C++ см. в разделе IMonthlyDOWTrigger. Сведения о разработке XML см. в разделе Элемент CalendarTrigger. | Запускает задачу в определенное время по ежемесячному расписанию на день недели. Например, задача начинается в 8:00 в определенные дни недели, недели месяца и месяцы года. |
Триггер простоя (триггер на основе событий).Сведения о разработке скриптов см. в разделе IdleTrigger. Сведения о разработке на C++ см. в разделе IIdleTrigger. Сведения о разработке XML см. в разделе Элемент IdleTrigger. | Запускает задачу, когда компьютер переходит в состояние простоя. |
Триггер регистрации (триггер на основе событий).Сведения о разработке скриптов см. в разделе RegistrationTrigger. Сведения о разработке на C++ см. в разделе IRegistrationTrigger. Сведения о разработке XML см. в разделе Элемент RegistrationTrigger. | Запускает задачу при регистрации или обновлении задачи. |
Триггер загрузки (триггер на основе событий).Сведения о разработке скриптов см. в разделе BootTrigger. Сведения о разработке на C++ см. в разделе IBootTrigger. Сведения о разработке XML см. в разделе Элемент BootTrigger. | Запускает задачу при загрузке системы. |
Триггер входа (триггер на основе событий).Сведения о разработке скриптов см. в разделе LogonTrigger. Сведения о разработке на C++ см. в разделе ILogonTrigger. Сведения о разработке XML см. в разделе Элемент LogonTrigger. | Запускает задачу при входе пользователя в систему. |
Триггер изменения состояния сеанса (триггер на основе событий). Сведения о разработке скриптов см. в разделе SessionStateChangeTrigger. Сведения о разработке на C++ см. в разделе ISessionStateChangeTrigger. Сведения о разработке XML см. в разделе Элемент SessionStateChangeTrigger. | Запускает задачу при изменении состояния сеанса сервера терминалов. |
Триггеры планировщика задач 1.0
Следующие типы триггеров определяются перечислением TASK_TRIGGER_TYPE . Чтобы реализовать любой из следующих триггеров, ознакомьтесь со структурой TASK_TRIGGER .
- Однократный триггер: запускает задачу один раз.
- Ежедневный триггер: запускает задачу с ежедневным интервалом.
- Еженедельный триггер: запускает задачу в еженедельном расписании.
- Ежемесячный триггер: запускает задачу по ежемесячному расписанию.
- Ежемесячный триггер DOW: запускает задачу по ежемесячному расписанию на день недели.
- Триггер простоя: запускает задачу, когда компьютер находится в состоянии простоя.
- Триггер запуска системы: запускает задачу при загрузке компьютера.
- Триггер входа. Запускает задачу при входе определенного пользователя.
Триггеры DML
Триггеры DML — это хранимые процедуры особого типа, автоматически вступающие в силу, если происходит событие языка обработки данных DML, которое затрагивает таблицу или представление, определенное в триггере. События DML включают инструкции INSERT, UPDATE или DELETE. Триггеры DML можно использовать для применения бизнес-правил и целостности данных, запроса других таблиц и включения сложных инструкций Transact-SQL. Триггер и инструкция, при выполнении которой он срабатывает, считаются одной транзакцией, которую можно откатить назад внутри триггера. При обнаружении серьезной ошибки (например, нехватки места на диске) вся транзакция автоматически откатывается назад.
Преимущества триггеров DML
Триггеры DML аналогичны ограничениям в том, что могут предписывать целостность сущностей или целостность домена. Вообще говоря, целостность сущностей должна всегда предписываться на самом нижнем уровне с помощью индексов, являющихся частью ограничений PRIMARY KEY и UNIQUE или создаваемых независимо от ограничений. Целостность домена должна быть предписана через ограничения CHECK, а ссылочная целостность — через ограничения FOREIGN KEY. Триггеры DML наиболее полезны в тех случаях, когда функции ограничений не удовлетворяют функциональным потребностям приложения.
В следующем списке приведено сравнение триггеров DML с ограничениями и указано, чем триггеры DML лучше ограничений.
- Триггеры DML позволяют каскадно проводить изменения через связанные таблицы в базе данных; но эти изменения могут осуществляться более эффективно с использованием каскадных ограничений ссылочной целостности. Ограничения FOREIGN KEY могут проверить значения столбца только на предмет точного совпадения со значениями другого столбца, за исключением случаев, когда с помощью предложения REFERENCES задаются каскадные ссылочные действия.
- Для предотвращения случайных или неверных операций INSERT, UPDATE и DELETE и реализации других более сложных ограничений, чем те, которые определены при помощи ограничения CHECK. В отличие от ограничений CHECK, DML-триггеры могут ссылаться на столбцы других таблиц. Например, триггер может использовать инструкцию SELECT для сравнения вставленных или обновленных данных и выполнения других действий, например изменения данных или отображения пользовательского сообщения об ошибке.
- Чтобы оценить состояние таблицы до и после изменения данных и предпринять действия на основе этого различия.
- Несколько DML-триггеров одинакового типа (INSERT, UPDATE или DELETE) для таблицы позволяют предпринять несколько различных действий в ответ на одну инструкцию изменения данных.
- Ограничения могут сообщать об ошибках только с помощью соответствующих стандартных системных сообщений. Если для пользовательского приложения требуются более сложные методы управления ошибками и, соответственно, пользовательские сообщения, то необходимо использовать триггер.
- При использовании триггеров DML может произойти откат изменений, нарушающих ссылочную целостность, что приводит к запрету модификации данных. Подобные триггеры могут применяться при изменении внешнего ключа в случаях, когда новое значение не соответствует первичному ключу. Обычно в указанных случаях используются ограничения FOREIGN KEY.
- Если в таблице триггеров существуют ограничения, то их проверка осуществляется между выполнением триггеров INSTEAD OF и AFTER. В случае нарушения ограничений выполняется откат действий триггеров INSTEAD OF, а триггер AFTER не срабатывает.
Типы триггеров DML
Триггер AFTER
Триггеры AFTER выполняются после выполнения действий инструкции INSERT, UPDATE, MERGE или DELETE. Триггеры AFTER никогда не выполняются, если происходит нарушение ограничения, поэтому эти триггеры нельзя использовать для какой-либо обработки, которая могла бы предотвратить нарушение ограничения. Для каждой из операций INSERT, UPDATE или DELETE в указанной инструкции MERGE соответствующий триггер вызывается для каждой операции DML.
Триггер INSTEAD OF
Триггеры INSTEAD OF переопределяют стандартные действия инструкции, вызывающей триггер. Поэтому они могут использоваться для проверки на наличие ошибок или проверки значений в одном или нескольких столбцах и выполнения дополнительных действий перед вставкой, обновлением или удалением одной строки или нескольких строк. Например, если обновляемое значение в столбце почасовой оплаты в таблице учетной ведомости начинает превышать определенное значение, то с помощью этого триггера можно либо задать вывод сообщения об ошибке и откатить транзакцию, либо сделать вставку новой записи в след аудита до вставки записи в таблицу учетной ведомости. Главное преимущество триггеров INSTEAD OF в том, что они позволяют поддерживать обновления для таких представлений, которые обновлять невозможно. Например, в представлении, основанном на нескольких базовых таблицах, должен использоваться триггер INSTEAD OF для поддержки операций вставки, обновления и удаления, которые ссылаются на данные больше чем в одной таблице. Другое преимущество триггера INSTEAD OF состоит в том, что он обеспечивает логику кода, при которой можно отвергать одни части пакета и принимать другие.
Функциональность триггеров AFTER и INSTEAD OF сравнивается в следующей таблице.
Декларативные ссылочные действия.
Создание таблицinserted и deleted .
Вместо: действие, запускающее триггер
Триггеры CLR
Триггер CLR может быть либо триггером AFTER, либо триггером INSTEAD OF. Триггер CLR может также являться триггером DDL. Вместо выполнения хранимой процедуры Transact-SQL триггер CLR выполняет один или несколько методов, написанных в управляемом коде, которые являются членами сборки, созданной в .NET Framework и переданной в SQL Server.
Связанные задачи
Задача | Раздел |
---|---|
Описывает, как создать триггер DML. | Создание триггеров DML |
Описывает, как создать триггер CLR. | Создание триггеров CLR |
Описывает, как создать триггер DML для выполнения и однострочных, и многострочных операций модификации данных. | Создание триггеров DML для обработки нескольких строк данных |
Описывает, как вкладывать триггеры. | Создание вложенных триггеров |
Описывает, как указывать порядок, в котором активируются триггеры AFTER. | Указание первого и последнего триггеров |
Описывает, как использовать специальные таблицы inserted и deleted в коде триггера. | Использование вставленных и удаленных таблиц |
Описывает, как изменить или переименовать триггер DML. | Изменение или переименование триггеров DML |
Описывает, как просматривать сведения о триггерах DML. | Получение сведений о триггерах DML |
Описывает, как удалять или отключать триггеры DML. | Удаление или отключение триггеров DML |
Описывает, как управлять безопасностью триггеров. | Управление безопасностью триггеров |
При подготовке материала использовались источники:
https://learn.microsoft.com/ru-ru/windows/win32/taskschd/trigger-types
https://learn.microsoft.com/ru-ru/sql/relational-databases/triggers/dml-triggers?view=sql-server-ver16