SQL | Триггеры

Опубликовано: 11 Августа, 2021

Триггер - это оператор, который система выполняет автоматически при любом изменении базы данных. В триггере мы сначала указываем, когда триггер должен быть выполнен, а затем действие, которое должно выполняться при выполнении триггера. Триггеры используются для указания определенных ограничений целостности и реляционных ограничений, которые нельзя указать с помощью механизма ограничений SQL.

Пример -
Предположим, мы добавляем туппл в таблицу «Доноры», что какой-то человек сдал кровь. Итак, мы можем разработать триггер, который автоматически добавит стоимость сданной крови в таблицу Blood_record.

Типы триггеров -
Мы можем определить 6 типов триггеров для каждой таблицы:

  1. AFTER INSERT активируется после вставки данных в таблицу.
  2. ПОСЛЕ ОБНОВЛЕНИЯ: активируется после изменения данных в таблице.
  3. ПОСЛЕ УДАЛЕНИЯ: активируется после удаления / удаления данных из таблицы.
  4. ПЕРЕД ВСТАВКОЙ: активируется перед вставкой данных в таблицу.
  5. ПЕРЕД ОБНОВЛЕНИЕМ: активируется перед изменением данных в таблице.
  6. ПЕРЕД УДАЛЕНИЕМ: активируется перед удалением / удалением данных из таблицы.

Примеры, показывающие реализацию триггеров:

1. Напишите триггер, чтобы гарантировать, что ни один сотрудник в возрасте до 25 лет не может быть добавлен в базу данных.

разделитель $$
СОЗДАТЬ TRIGGER Check_age ПЕРЕД ВСТАВКОЙ НА сотрудника 
ДЛЯ КАЖДОЙ РЯДЫ
НАЧИНАТЬ
ЕСЛИ НОВЫЙ. Возраст <25, ТО
СИГНАЛ SQLSTATE '45000'
SET MESSAGE_TEXT = 'ОШИБКА: 
         ВОЗРАСТ ДОЛЖЕН БЫТЬ НЕ МЕНЕЕ 25 ЛЕТ! ';
КОНЕЦ ЕСЛИ;
КОНЕЦ; $$
разделитель;

Объяснение: Каждый раз, когда мы хотим вставить какой-либо кортеж в таблицу «employee», перед вставкой этого кортежа в таблицу будет выполняться триггер с именем «Check_age». Этот триггер проверит атрибут возраста. Если оно больше 25, то этот туппл будет вставлен в туппл, в противном случае будет напечатано сообщение об ошибке «ОШИБКА: ВОЗРАСТ ДОЛЖЕН БЫТЬ НЕ МЕНЕЕ 25 ЛЕТ!»

2. Создайте триггер, который сработает перед удалением в таблице сотрудников, и создайте дублирующую копию записи в другой таблице employee_backup.

Перед написанием триггера нам нужно создать таблицу employee_backup

создать таблицу employee_backup (employee_no int, 
      имя сотрудника varchar (40), задание varchar (40), 
      дата приема на работу, оклад int, 
      первичный ключ (employee_no));
 разделитель $$
СОЗДАТЬ резервную копию TRIGGER ПЕРЕД УДАЛЕНИЕМ сотрудника 
ДЛЯ КАЖДОЙ РЯДЫ
НАЧИНАТЬ
ВСТАВИТЬ В employee_backup
ЗНАЧЕНИЯ (OLD.employee_no, OLD.name, 
        СТАРАЯ. Работа, СТАРАЯ. Наемная работа, СТАРАЯ. Зарплата);
КОНЕЦ; $$
разделитель;

Объяснение: Мы хотим создать резервную таблицу, в которой будут храниться данные о тех сотрудниках, которые больше не являются сотрудниками учреждения. Итак, мы создаем триггер с именем Backup, который будет выполняться перед удалением любого Tupple из сотрудника таблицы. Перед удалением значения всех атрибутов таблицы employee будут сохранены в таблице employee_backup.

3. Напишите триггер для подсчета количества новых кортежей, вставленных с помощью каждого оператора вставки.

 Объявить count int
Установить count = 0;
разделитель $$
СОЗДАТЬ ТРИГГЕР Count_tupples 
             ПОСЛЕ ВСТАВКИ НА сотрудника 
ДЛЯ КАЖДОЙ РЯДЫ
НАЧИНАТЬ
НАБОР count = count + 1;
КОНЕЦ; $$
разделитель;

Explanation: Мы хотим отслеживать количество новых Tupples в таблице сотрудников. Для этого мы сначала создаем переменную count и инициализируем ее значением 0. После этого мы создаем триггер с именем Count_tupples, который будет увеличивать значение count после вставки любого нового Tupple в таблицу employee.