Что такое триггер в информатике
Триггер — это PL/SQL блок, который хранится в базе данных и срабатывает (выполняется) в ответ на указанное событие.
Триггер может быть определён на таблицу, представление, схему (владельца схемы) или базу данных (всех пользователей).
Типы событий триггеров:
- DML-команда ( DELETE , INSERT или UPDATE ).
- DDL-команды ( CREATE , ALTER или DROP ).
- Операции базы данных, такие как SERVERERROR , LOGON , LOGOFF , STARTUP или SHUTDOWN .
Пример создания триггера:
2. Типы триггеров
Триггеры делятся на:
- Триггеры базы данных. Срабатывают при возникновении DML, DDL или системного события в схеме или базе данных.
- Триггеры приложений. Срабатывают при возникновении события в конкретном приложении.
Триггеры можно использовать для:
- Безопасности.
- Аудита.
- Целостности данных.
- Ссылочной целостности.
- Репликации (копирования) таблиц.
- Автоматического вычисления производных данных.
- Ведения журнала событий.
Допустимые типы триггеров:
- Простые DML-триггеры ( BEFORE , AFTER , INSTEAD OF (только для view)).
- Составные (compound) триггеры.
- Не DML-триггеры (DDL-события, события базы данных).
- Уровня команды (по умолчанию). Срабатывают один раз на событие триггера, даже тогда, когда не затронута ни одна из строк.
- Строковыми. Нужно прописать FOR EACH ROW , срабатывают один раз на каждую затронутую строку по событию триггера, не срабатывают, если событие не затронуло ни одной строки.
3. Использование условных предикатов
Можно так же задавать условия для выполнения триггеров.
В теле триггера можно использовать конструкции (если триггер состоит из нескольких DML-операций):
- IF DELETING ,
- IF UPDATING ,
- IF INSERTING ,
чтобы определить, какое событие вызвало триггер, который слушает несколько событий.
Можно так же использовать WHEN для строковых триггеров.
О NEW и OLD (доступны только в строковых триггерах):
DML-команда | OLD | NEW |
---|---|---|
INSERT | NULL | введённое значение |
UPDATE | значение до обновления | значение после обновления |
DELETE | удаляемое значение | NULL |
Краткое описание модели выполнения триггера:
- Выполняются все BEFORE триггеры уровня команды.
- Для каждой строки, затронутой триггером:
- Выполняются все строковые BEFORE триггеры
- Выполняется DML-команда и проверка ограничений целостности.
- Выполняются все строковые AFTER триггеры.
У триггера есть 2 состояния: ENABLE и DISABLE . Синтаксис:
4. Тестирование триггеров
- Протестируйте каждую операцию с данными, вызывающую срабатывание триггера, а также операции с данными, не вызывающие триггеры.
- В каждом случае протестируйте условие WHEN .
- Вызовите срабатывание триггера непосредственно из операции с основными данными, а также косвенно из процедуры.
- Проверьте влияния триггера на другие триггеры.
- Проверьте влияния других триггеров на данный триггер.
Информацию о триггерах можно посмотреть в словарях USER_OBJECTS , USER/ALL/DBA_TRIGGERS . Синтаксис ошибок триггеров можно посмотреть в словаре USER_ERRORS .
5. Составные (compound) триггеры
Составной (compound) триггер — это один триггер на таблицу, позволяющий задать действия для каждой из следующих четырёх точек синхронизации:
Триггер (базы данных)
Три́ггер (англ. trigger ) — это хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено действием по модификации данных: добавлением INSERT , удалением DELETE строки в заданной таблице, или изменением UPDATE данных в определенном столбце заданной таблицы реляционной базы данных. Триггеры применяются для обеспечения целостности данных и реализации сложной бизнес-логики. Триггер запускается сервером автоматически при попытке изменения данных в таблице, с которой он связан. Все производимые им модификации данных рассматриваются как выполняемые в транзакции, в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции.
Момент запуска триггера определяется с помощью ключевых слов BEFORE (триггер запускается до выполнения связанного с ним события; например, до добавления записи) или AFTER (после события). В случае, если триггер вызывается до события, он может внести изменения в модифицируемую событием запись (конечно, при условии, что событие — не удаление записи). Некоторые СУБД накладывают ограничения на операторы, которые могут быть использованы в триггере (например, может быть запрещено вносить изменения в таблицу, на которой «висит» триггер, и т. п.)
Кроме того, триггеры могут быть привязаны не к таблице, а к представлению (VIEW). В этом случае с их помощью реализуется механизм «обновляемого представления». В этом случае ключевые слова BEFORE и AFTER влияют лишь на последовательность вызова триггеров, так как собственно событие (удаление, вставка или обновление) не происходит.
В некоторых серверах триггеры могут вызываться не для каждой модифицируемой записи, а один раз на изменение таблицы. Такие триггеры называются табличными.
В этом случае для отличия табличных триггеров от строчных вводится дополнительные ключевые слова при описании строчных триггеров. В Oracle это словосочетание FOR EACH ROW.
5.7. Что такое триггер?
Триггер— это электронная схема, широко применяемая в регистрах компьютера для надёжного запоминания одного разряда двоичного кода. Триггер имеет два устойчивых состояния, одно из которых соответствует двоичной единице, а другое — двоичному нулю.
Термин триггерпроисходит от английского словаtrigger— защёлка, спусковой крючок. Для обозначения этой схемы в английском языке чаще употребляется терминflip-flop, что в переводе означает “хлопанье”. Это звукоподражательное название электронной схемы указывает на её способность почти мгновенно переходить (“перебрасываться”) из одного электрического состояния в другое и наоборот.
Самый распространённый тип триггера — так называемый RS-триггер (S и R, соответственно, от английских set— установка, иreset— сброс). Условное обозначение триггера — на рис. 5.6.
Рис. 5.6
Он имеет два симметричных входа S и R и два симметричных выхода Q и
, причем выходной сигнал Q является логическим отрицанием сигнала
.
На каждый из двух входов S и R могут подаваться входные сигналы в виде кратковременных импульсов (
).
Наличие импульса на входе будем считать единицей, а его отсутствие — нулем.
На рис. 5.7 показана реализация триггера с помощью вентилей ИЛИ—НЕ и соответствующая таблица истинности.
Рис. 5.7
Что такое триггеры в SQL
Здравствуйте, уважаемые читатели. Подходим к завершающей статье по основам SQL. В этой статье разберем такое понятие, как триггеры в SQL.
Триггер — это особая разновидность хранимой процедуры, которая автоматически выполняется при возникновении события на сервере базы данных.
Общие сведения
Итак, разберем такую сущность SQL как триггеры. Также как представления и процедуры — триггеры в SQL создаются и хранятся отдельно до момента их удаления. Триггеры по своей сути представляют обработчики событий. Они выполняются при наступлении какого-либо простого действия в SQL. Такими действиями обычно являются: удаление, вставка и обновление данных.
То есть, триггер — это по сути ловушка, которая срабатывает при определенном действии. Триггер позволяет автоматизировать некоторые расчетные рутинные действия. Примеры мы разберем дальше.
Создание триггеров в SQL
Напомню, что мы работаем в MySQL. Триггеры создаются также, как и хранимые процедуры в SQL. Либо во вкладке SQL с помощью кода, либо с помощью графического редактора во вкладке триггеры. Оператор для создания следующий:
После оператора и имени триггера необходимо указать в каком случае будет срабатывать триггер. Возможно 6 вариантов:
- BEFORE INSERT
- BEFORE UPDATE
- BEFORE DELETE
- AFTER INSERT
- AFTER UPDATE
- AFTER DELETE
То есть триггер срабатывает либо до, дибо после вставки, обновления, удаления данных из БД в SQL.
Пример работы в SQL
Если вы не знакомы со структурой нашей БД, то советуем почитать предыдущие уроки.
Рассмотрим тестовую задачу, которая покажет возможности триггеров. Предположим, что в таблице orders нам нужно поменять цену (поле amt), а новое значение, которое мы введем, увеличить еще на 20%. Задача бывает полезна, когда нужно сделать наценку на товар.
Чтобы нам не высчитывать 20% вручную от новой цены — создадим триггер. Он автоматически будет увеличивать новую цену на 20%.
Вот код создания такого триггера:Заметьте, что название триггера (Before_Update_amt) лучше всего давать такое, чтобы было понятно при каком случае он срабатывает. Триггер срабатывает перед обновлением потому, что сначала мы должны узнать новое значение, а только потом его занести в поле.
Отметим также ключевого слово NEW — это то значение, которое должно было попасть в таблицу, но мы создали триггер и теперь это значение еще увеличивается на 20%.
Следующий момент — цикл FOR EACH ROW. Он необходим потому, что одновременно может изменяться не одно значение, а несколько строк. Вот, для каждой измененной строчки мы и увеличиваем значение на 20%.
Триггер на взаимодействие таблиц
Рассмотрим еще одну задачу: у нас есть продавец (в таблице salespeople), и его продажи отражены в таблицы orders. Представим теперь, что продавец увольняется и все его продажи тоже следует удалить. Если таких продаж много, то легче всего воспользоваться триггером.
Итак, после удаления продавца из salespeople берется его уникальный номер snum — он записан в коде как OLD.snum. Затем, по этому уникальному номеру удаляются все строчки из таблицы orders.
Можете проверить этот код, или его аналог. После удаления продавца триггер в SQL удаляет все записи из таблицы orders.
Ключевые слова OLD и NEW
На всякий случай, еще раз разберем употребление этих ключевых слов.
NEW — это значение, которое может появиться только после обновления или вставки данных. Оно содержит то значение, которое должно появиться в таблице. С помощью триггера можно изменить это новое значение, как было сделано в первом примере этой статьи.
OLD — это значение, которое уже было в таблице, либо перед удалением, либо перед обновлением. Обращаться к этому значению имеет смысл, чтобы получить id, и по этому id в другой таблице удалить связанные записи. Так было сделано во втором примере.
Заключение
На этом мы закончим. Небольшая статья, но все основные моменты триггеров в SQL были продемонстрированы. Если у вас остались вопросы, то оставляйте их в комментариях.