Триггеры представляют собой специальные объекты в базе данных, которые автоматически выполняются при определенных событиях. Они могут использоваться для мониторинга и контроля изменений данных.
В одном из типичных сценариев использования триггера, возникает необходимость отслеживать старое и новое значение определенной колонки при обновлении записи. Например, вы хотите сохранить историю изменений определенного поля, чтобы иметь возможность отследить, кто и когда внес изменения.
Например, в MySQL вы можете использовать переменные OLD и NEW следующим образом:
DELIMITER $$
CREATE TRIGGER trigger_name AFTER UPDATE
ON table_name FOR EACH ROW
BEGIN
SELECT CONCAT('Старое значение: ', OLD.column_name) AS old_value;
SELECT CONCAT('Новое значение: ', NEW.column_name) AS new_value;
END$$
Старое и новое значение в триггере
Для того чтобы вывести старое и новое значение в триггере, можно использовать специальные переменные OLD и NEW, которые предоставляют доступ к соответствующим значениям. OLD позволяет получить старое значение, а NEW — новое значение.
- Сохранять старое и новое значение имени в отдельные переменные.
Пример кода триггера:
CREATE TRIGGER trg_users_update
ON users
AFTER UPDATE
AS
BEGIN
DECLARE @oldName NVARCHAR(MAX);
DECLARE @newName NVARCHAR(MAX);
SELECT @oldName = name
FROM deleted;
SELECT @newName = name
FROM inserted;
PRINT 'Старое значение: ' + @oldName + ', новое значение: ' + @newName;
END;
Использование старого и нового значения в триггере позволяет более гибко управлять данными и проводить различные операции на основе изменений, происходящих в таблице.
Получение старого значения
Предположим, что у нас есть триггер, который срабатывает после обновления строки в таблице. Если нам нужно получить старое значение столбца name
, мы можем использовать следующий код:
CREATE TRIGGER after_update_trigger
AFTER UPDATE ON table_name
FOR EACH ROW
BEGIN
DECLARE old_name VARCHAR(255);
SET old_name = OLD.name;
-- Дальнейшая обработка старого значения
END;
В данном примере мы объявляем переменную old_name
типа VARCHAR
, которая будет хранить старое значение столбца name
. Затем мы используем оператор SET
для присваивания этой переменной значения из переменной OLD.name
.
После получения старого значения, его можно использовать для дальнейшей обработки, например, для сравнения со значением после обновления и выполнения нужных действий в соответствии с результатом этого сравнения.
Таким образом, использование переменной OLD
позволяет получить старое значение в триггере и осуществить с ним нужные действия.
Получение нового значения
В триггере можно получить новое значение столбца, для которого сработал триггер. Для этого используется ключевое слово NEW, после которого указывается имя столбца. Например:
- NEW.column_name
В результате выполнения триггера, можно использовать полученное новое значение для выполнения различных операций. Например, можно сохранить старое и новое значение в другую таблицу или выполнить какие-либо рассчеты на основе нового значения.
Пример использования:
CREATE TRIGGER example_trigger
AFTER UPDATE ON table_name
FOR EACH ROW
BEGIN
DECLARE old_value INT;
DECLARE new_value INT;
SET old_value = OLD.column_name;
SET new_value = NEW.column_name;
-- выполнение дополнительных операций с новым значением
END;
Для этого можно воспользоваться специальными псевдотаблицами OLD и NEW, которые содержат старое и новое значение соответствующих столбцов.
Например, если у нас есть таблица «users» с атрибутами «id», «name» и «age», и мы хотим вывести старое и новое значение атрибута «name» при обновлении записи, мы можем создать триггер с помощью следующего SQL-запроса:
CREATE TRIGGER update_name_trigger AFTER UPDATE ON users FOR EACH ROW BEGIN DECLARE old_name VARCHAR(255); DECLARE new_name VARCHAR(255); SET old_name = OLD.name; SET new_name = NEW.name; SELECT CONCAT('Старое значение: ', old_name) INTO @old_value; SELECT CONCAT('Новое значение: ', new_name) INTO @new_value; SET @message = CONCAT('Изменено имя пользователя. ', @old_value, ', ', @new_value); INSERT INTO log_table (message) VALUES (@message); END
В данном примере мы создаем триггер update_name_trigger, который срабатывает после обновления записи в таблице «users». Мы объявляем переменные old_name и new_name и присваиваем им соответствующие значения из псевдотаблиц OLD и NEW.
Затем мы создаем строку сообщения @message, которая содержит информацию об измененном имени пользователя. Эта строка добавляется в таблицу log_table с помощью оператора INSERT.
Таким образом, при обновлении записи в таблице «users» с использованием этого триггера, в таблицу log_table будет добавлена запись, содержащая старое и новое значение атрибута «name».
Триггеры позволяют автоматизировать определенные действия в базе данных и могут быть очень полезными при отслеживании изменений или выполнении сложной логики.
Практический пример работы с старыми и новыми значениями
Для работы с старыми и новыми значениями в триггере, мы можем использовать специальные переменные, предоставляемые системой управления базами данных. Рассмотрим пример использования PostgreSQL:
CREATE OR REPLACE FUNCTION update_salary_trigger() RETURNS TRIGGER AS $$ BEGIN -- Старое значение зарплаты DECLARE old_salary numeric; -- Новое значение зарплаты DECLARE new_salary numeric; -- ID сотрудника DECLARE employee_id int; -- Получаем старое и новое значение зарплаты, а также ID сотрудника из системных переменных old_salary := OLD.salary; new_salary := NEW.salary; employee_id := NEW.employee_id; RAISE NOTICE 'Старая зарплата сотрудника с ID %: %', employee_id, old_salary; RAISE NOTICE 'Новая зарплата сотрудника с ID %: %', employee_id, new_salary; -- Продолжаем выполнение триггера RETURN NEW; END; $$ LANGUAGE plpgsql; -- Создаем триггер на обновление зарплаты CREATE TRIGGER salary_update_trigger AFTER UPDATE ON employees FOR EACH ROW EXECUTE FUNCTION update_salary_trigger();
Затем мы создаем триггер salary_update_trigger
, который срабатывает после обновления данных в таблице employees
. Для каждой обновленной строки он вызывает функцию update_salary_trigger()
. Таким образом, при каждом обновлении зарплаты сотрудника, в логе будет отображаться старое и новое значение зарплаты.