
Триггер в SQL Server – это объект базы данных, автоматически выполняющий заданный код при определённых событиях: вставке, обновлении или удалении данных. Его основное назначение – контроль целостности данных, аудит изменений и реализация бизнес-логики на уровне сервера. Например, триггер может запретить удаление записей из таблицы без соответствующего разрешения или автоматически фиксировать информацию об изменениях в журнале.
Создание триггера в SQL Server Management Studio (SSMS) начинается с выбора таблицы, для которой он будет действовать. Обычно используется оператор CREATE TRIGGER, определяющий событие (INSERT, UPDATE или DELETE) и код, который должен выполняться после или вместо него. При этом важно учитывать тип триггера: AFTER выполняется после операции, а INSTEAD OF – заменяет её выполнение.
При разработке триггеров следует уделять внимание производительности и безопасности. Избыточное использование триггеров может замедлить выполнение транзакций, особенно при работе с большим объёмом данных. Рекомендуется тестировать триггеры на копии базы, проверять корректность срабатывания при множественных изменениях и следить за тем, чтобы логика не вызывала циклических обновлений.
Далее в статье рассматриваются практические примеры создания и отладки триггеров, а также рекомендации по их оптимизации в SSMS.
Подготовка таблицы и данных для создания триггера

Перед созданием триггера необходимо иметь таблицу, на события которой он будет реагировать. Рассмотрим пример таблицы Sales, где фиксируются продажи товаров. Таблица будет содержать поля для идентификатора, названия товара, количества, цены и даты продажи.
Создание таблицы выполняется следующим запросом:
CREATE TABLE Sales (
SaleID INT IDENTITY(1,1) PRIMARY KEY,
ProductName NVARCHAR(100) NOT NULL,
Quantity INT CHECK (Quantity > 0),
Price DECIMAL(10,2) CHECK (Price > 0),
SaleDate DATETIME DEFAULT GETDATE()
);
После создания таблицы стоит заполнить её тестовыми данными, чтобы проверить работу триггера на практике:
INSERT INTO Sales (ProductName, Quantity, Price)
VALUES
('Монитор', 3, 14500.00),
('Клавиатура', 10, 1200.50),
('Мышь', 7, 850.00);
Для удобства можно создать дополнительную таблицу SalesLog, куда триггер будет записывать информацию о произведённых изменениях:
CREATE TABLE SalesLog (
LogID INT IDENTITY(1,1) PRIMARY KEY,
ActionType NVARCHAR(20),
ProductName NVARCHAR(100),
Quantity INT,
ActionDate DATETIME DEFAULT GETDATE()
);
После выполнения этих шагов база готова к созданию триггера, который будет фиксировать операции добавления, изменения или удаления записей.
| Таблица | Назначение |
|---|---|
| Sales | Хранение данных о продажах |
| SalesLog | Регистрация действий триггера |
Создание триггера с помощью графического интерфейса SSMS

Для создания триггера через интерфейс SQL Server Management Studio откройте нужную базу данных в Object Explorer и перейдите к разделу Tables. Разверните список таблиц и выберите ту, для которой требуется создать триггер.
Кликните правой кнопкой по таблице, выберите пункт Triggers, затем New Trigger. В окне редактора появится шаблон кода, где можно задать имя триггера, событие (AFTER или INSTEAD OF) и действия, выполняемые при изменении данных.
Пример структуры:
CREATE TRIGGER [dbo].[ИмяТриггера]
ON [dbo].[ИмяТаблицы]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;
-- Действия при выполнении триггера
END
После внесения изменений нажмите Execute или сочетание клавиш F5. Триггер будет создан и появится в списке Triggers выбранной таблицы. Чтобы проверить его работу, выполните операции INSERT, UPDATE или DELETE и убедитесь, что срабатывание происходит согласно указанной логике.
Для редактирования существующего триггера выберите его в разделе Triggers и используйте команду Modify. Здесь можно изменить логику выполнения, тип события или условия срабатывания. После сохранения изменений выполните команду ALTER TRIGGER через кнопку Execute.
Написание триггера вручную через окно запроса

Триггер можно создать без конструктора, используя окно запроса в SQL Server Management Studio. Такой способ позволяет контролировать структуру и логику кода.
Пример базового синтаксиса:
CREATE TRIGGER trg_AfterInsert_Orders
ON Orders
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
sqlCopy codeINSERT INTO AuditLog (ActionType, TableName, ActionDate)
VALUES ('INSERT', 'Orders', GETDATE());
END;
GO
Основные элементы структуры:
- CREATE TRIGGER – объявление триггера с уникальным именем.
- ON – указание таблицы, к которой он привязан.
- AFTER | INSTEAD OF – момент срабатывания (после операции или вместо неё).
- INSERT, UPDATE, DELETE – тип события.
- BEGIN…END – блок действий, выполняемых при срабатывании.
Рекомендации:
- Перед созданием убедитесь, что у вас есть права
ALTERилиCREATE TRIGGERдля выбранной таблицы. - При обращении к вставленным или удалённым данным используйте псевдотаблицы
INSERTEDиDELETED. - Проверяйте триггеры на избыточные вызовы – особенно если внутри выполняются операции записи.
- После создания выполните команду
EXEC sp_helptext 'trg_AfterInsert_Orders', чтобы проверить текст триггера.
Создание через окно запроса даёт гибкость: можно использовать условия, соединения, вложенные транзакции и управление ошибками без ограничений интерфейса конструктора.
Проверка работы триггера на примере вставки и обновления данных
После создания триггера необходимо убедиться, что он корректно реагирует на изменения данных. Для примера рассмотрим таблицу Employees с полями Id, Name и Salary, а также триггер, фиксирующий изменения в отдельной таблице EmployeesLog.
Пример вставки данных для проверки:
INSERT INTO Employees (Name, Salary) VALUES ('Иван Петров', 65000);
После выполнения запроса нужно проверить содержимое таблицы EmployeesLog:
SELECT * FROM EmployeesLog;
Если триггер настроен правильно, появится запись с типом операции INSERT и указанием вставленных значений.
Для проверки реакции триггера на обновление выполните:
UPDATE Employees SET Salary = 70000 WHERE Name = 'Иван Петров';
Затем снова выполните выборку из EmployeesLog. Должна появиться новая строка с типом операции UPDATE, в которой фиксируются старое и новое значение поля Salary.
Если таблица журнала заполняется корректно и отражает все изменения, триггер работает стабильно. В противном случае следует проверить условия срабатывания, имена полей и логику вставки данных в журнал.
Просмотр и изменение существующих триггеров в базе данных
Чтобы просмотреть список триггеров в SQL Server Management Studio, откройте объект «Triggers» в соответствующей таблице или в разделе «Database Triggers». В контекстном меню можно выбрать пункт «Modify» или «Script Trigger as» → «ALTER To» → «New Query Editor Window», чтобы получить SQL-код текущего триггера.
Альтернативный способ – использовать системные представления. Запрос:
SELECT name, parent_class_desc, create_date, modify_date
FROM sys.triggers;
показывает имена, тип и даты создания и изменения триггеров. Для триггеров, связанных с таблицами, можно уточнить запрос:
SELECT t.name AS TriggerName, tbl.name AS TableName
FROM sys.triggers t
JOIN sys.tables tbl ON t.parent_id = tbl.object_id;
Чтобы изменить существующий триггер, используйте оператор ALTER TRIGGER. Например:
ALTER TRIGGER trg_UpdateDate
ON dbo.Orders
AFTER UPDATE
AS
BEGIN
UPDATE dbo.Orders
SET ModifiedDate = GETDATE()
WHERE OrderID IN (SELECT DISTINCT OrderID FROM inserted);
END;
После изменения триггер можно пересобрать, выполнив команду ALTER TRIGGER, или обновить через интерфейс SSMS, выбрав пункт «Save». Для контроля актуальности изменений рекомендуется проверять дату модификации через представление sys.triggers или использовать команду sp_helptext 'имя_триггера' для просмотра его кода.
Удаление триггера и очистка связанных объектов
Для удаления триггера в SQL Server используется команда DROP TRIGGER. Синтаксис для триггера на таблицу: DROP TRIGGER [Имя_триггера] ON [Имя_таблицы]. Для триггера на базу данных применяется: DROP TRIGGER [Имя_триггера] ON DATABASE.
Перед удалением рекомендуется проверить зависимые объекты и процессы. Используйте представление sys.triggers для получения списка триггеров и sys.sql_expression_dependencies для выявления зависимостей между триггером и другими объектами.
После удаления триггера следует очистить связанные элементы, например временные таблицы или записи в журналах изменений, если триггер их создавал. Команды DROP TABLE или DELETE применяются с точной фильтрацией по созданным объектам, чтобы не затронуть важные данные.
Если триггер был частью сложного бизнес-процесса, убедитесь, что альтернативная логика обработки событий внедрена, чтобы исключить потерю данных или неконсистентное состояние базы.
Для систематической проверки после удаления используйте sp_helptext [Имя_триггера] для подтверждения отсутствия кода и sp_depends [Имя_триггера] для выявления оставшихся зависимостей.
Вопрос-ответ:
Что такое триггер в SQL Server и для чего он используется?
Триггер — это специальный объект базы данных, который автоматически выполняет определённый набор действий при изменении данных в таблице. Он может реагировать на операции INSERT, UPDATE или DELETE, позволяя, например, вести аудит изменений, проверять корректность данных или синхронизировать таблицы. Триггеры работают на уровне базы данных и запускаются без прямого вызова со стороны пользователя.
Какие типы триггеров поддерживает SQL Server и чем они отличаются?
SQL Server поддерживает два основных типа триггеров: AFTER и INSTEAD OF. AFTER-триггер выполняется после завершения операции INSERT, UPDATE или DELETE и позволяет проверять или фиксировать изменения. INSTEAD OF-триггер заменяет стандартную операцию и выполняет альтернативный набор действий, что полезно, например, при сложных проверках или изменении логики записи данных.
Как создать триггер через графический интерфейс SSMS?
Для создания триггера в SSMS откройте дерево объектов базы данных, выберите нужную таблицу, затем правой кнопкой мыши выберите «New Trigger». В открывшемся окне можно прописать SQL-код триггера, указав события (INSERT, UPDATE, DELETE) и действия, которые должны выполняться при этих событиях. После сохранения триггер будет автоматически подключён к выбранной таблице и начнёт реагировать на заданные операции.
Можно ли проверить работу триггера и как это сделать?
Да, работу триггера можно проверить, выполнив соответствующую операцию с таблицей, к которой он привязан. Например, для теста INSERT-триггера достаточно добавить новую запись в таблицу и затем посмотреть, выполнены ли заданные действия (например, обновление другой таблицы или запись в журнал). Также можно использовать команду SELECT из системных представлений, таких как sys.triggers и sys.trigger_events, чтобы убедиться, что триггер создан и активен.
