Введение

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

Типы триггеров

В SQL Server существует три основных типа триггеров:

  1. Триггеры DDL. Эти триггеры срабатывают в ответ на события языка определения данных (DDL), такие как операторы CREATE, ALTER или DROP.
  2. Триггеры DML: эти триггеры срабатывают в ответ на события языка манипулирования данными (DML), такие как операторы INSERT, UPDATE или DELETE.
  3. Триггеры входа в систему: эти триггеры срабатывают в ответ на событие LOGON, позволяя вам контролировать и управлять входом пользователей в систему.

Создание триггеров

Чтобы создать триггер, вы используете оператор CREATE TRIGGER, за которым следует имя триггера, событие триггера и действие, которое необходимо выполнить. Вот простой пример триггера DML, который регистрирует все удаленные записи в таблице аудита:

CREATE TRIGGER trg_AfterDelete
ON Employees
AFTER DELETE
AS
BEGIN
    INSERT INTO EmployeeAudit
    SELECT *, GETDATE() AS DeleteDate
    FROM deleted;
END;

В этом примере триггер trg_AfterDelete создается в таблице «Сотрудники» и срабатывает после события DELETE. Когда триггер срабатывает, он вставляет удаленные записи в таблицу EmployeeAudit вместе с текущей датой и временем.

Изменение триггеров

Чтобы изменить триггер, вы используете оператор ALTER TRIGGER, за которым следует имя триггера и новое действие для выполнения. Например, вы можете обновить триггер trg_AfterDelete, чтобы он также регистрировал события UPDATE:

ALTER TRIGGER trg_AfterDelete
ON Employees
AFTER DELETE, UPDATE
AS
BEGIN
    IF EXISTS (SELECT * FROM deleted)
    BEGIN
        INSERT INTO EmployeeAudit
        SELECT *, GETDATE() AS ActionDate, 'DELETE' AS ActionType
        FROM deleted;
    END

IF EXISTS (SELECT * FROM inserted)
    BEGIN
        INSERT INTO EmployeeAudit
        SELECT *, GETDATE() AS ActionDate, 'UPDATE' AS ActionType
        FROM inserted;
    END
END;

Отключение и включение триггеров

Вы можете временно отключить триггер с помощью оператора DISABLE TRIGGER:

DISABLE TRIGGER trg_AfterDelete ON Employees;

Чтобы снова включить триггер, используйте оператор ENABLE TRIGGER:

ENABLE TRIGGER trg_AfterDelete ON Employees;

Заключение

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