
Создание триггеров
Триггер предназначен для автоматического запуска системой SQL Server при модифицировании данных какой-либо таблицы. Триггер запускается сервером автоматически при попытке изменения данных в таблице, с которой он связан. Все производимые им модификации данных выполняются в 1 транзакции с действием, вызвавшем срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции, т.е. ни действие триггера ни модификация данных будут не выполнены. Кроме того, триггеры могут быть привязаны не к таблице, а к представлению. В этом случае с их помощью реализуется механизм «обновляемого представления» (т.к. представление представляет собой выборку, то при помощи него нельзя изменять\добавлять\удалять данные, триггер это «исправляет»).
Шаблон создания триггера:
CREATE TRIGGER [Название триггера]
AFTER <Событие>
ON <Таблица>
BEGIN
<Выполняемые действия>
END;
Для создания триггера нужно открыть папку нужной таблицы и нажатием правой кнопкой мыши по «триггеры» вызвать меню, в котором выбрать «Создать триггер» (Рисунок 14).
Рисунок 25.
Далее надо ввести код триггера и запустить его - нажать на панели «Выполнить». При удачном выполнении триггера появится сообщение «Выполнение команд успешно завершено» (Рисунок 15).
Рисунок 26.
Создайте триггер для таблицы «Студент», который будет при добавлении студента в таблицу «Студент» добавлять строки в таблицу «Успеваемость» для этого студента с его предметами. При помощи этого триггера, при работе с БД не нужно будет вручную добавлять записи в успеваемость для каждого студента. Код триггера:
CREATE TRIGGER [Вставка в Успеваемость]
ON [dbo].[Студент]
AFTER INSERT
AS
BEGIN
Insert into [dbo].[Успеваемость] (ID, [ID ST])
select t1.ID, t2.[ID_ ST]
from [dbo].[Изучение] t1
cross join
[dbo].[Студент] t2
Left outer join
[dbo].[Успеваемость] t3
ON t1.ID = t3.ID and t2.[ID_ ST] = t3.[ID ST]
Where t1.G_ID = t2.G_ID and t3.ID is null
END
GO
Как он должен выглядеть отображено на рисунке 16.
Рисунок 27.
Создайте аналогичный триггер для таблицы «Изучение», который будет при добавлении записи о изучении в таблицу «Изучение» добавлять строки в таблицу «Успеваемость» для студентов группы, занимающихся по этому предмету. При помощи этого триггера, при работе с БД не нужно будет вручную добавлять записи в успеваемость для каждого студента. Код триггера:
CREATE TRIGGER [Вставка в Успеваемость 2]
ON [dbo].[Изучение]
AFTER INSERT
AS
BEGIN
Insert into [dbo].[Успеваемость] (ID, [ID ST])
select t1.ID, t2.[ID_ ST]
from [dbo].[Изучение] t1
cross join
[dbo].[Студент] t2
Left outer join
[dbo].[Успеваемость] t3
ON t1.ID = t3.ID and t2.[ID_ ST] = t3.[ID ST]
Where t1.G_ID = t2.G_ID and t3.ID is null
END
GO
Создайте триггер для таблицы «Изучение», который будет при удалении записи об изучении из таблицы «Изучение» удалять строки из таблицы «Успеваемость» для студентов группы, занимающихся по этому предмету. При помощи этого триггера будет поддерживаться целостность БД. Код триггера:
CREATE TRIGGER [Удаление из Успеваемости]
ON [dbo].[Изучение]
AFTER DELETE
AS
BEGIN
Delete [dbo].[Успеваемость]
where ID = (select ID from deleted)
END
GO
Так же востребованы триггеры для работы с представлением «План занятий». Соответственно далее представлены 3 триггера, заменяющие действия удаления, добавления, обновления.
CREATE TRIGGER [dbo].[Удаление из Изучения]
ON [dbo].[План занятий]
Instead of DELETE
AS
set nocount on
BEGIN
delete from [dbo].[Изучение] where ID = (select Id from deleted)
END
CREATE TRIGGER [dbo].[Обновление в Изучении]
ON [dbo].[План занятий]
Instead of UPDATE
AS
set nocount on
BEGIN
UPdate [dbo].[Изучение]
set [G_ID] = t1.[G_ID], [КП] = t2.[КП], [Табн] = t3.[Табн],
[Видз] = t1.[Видз], [Часы]=t1.[Часы], [СбаллГр]=t1.[СбаллГр]
From ([inserted] t1
left outer join [dbo].[Предмет] t2
ON t1.НП = t2.НП
left outer join [dbo].[Преподаватель] t3
ON t1.ФИО = t3.ФИО)
where [dbo].[Изучение].[ID] in (select t1.[ID] from inserted)
END
CREATE TRIGGER [dbo].[Вставка в Изучение]
ON [dbo].[План занятий]
Instead of INSERT
AS
set nocount on
BEGIN
Insert INTO [dbo].[Изучение]
(G_ID, КП, Табн, Видз, Часы, СбаллГр)
Select
t1.G_ID, t2.КП, t3.Табн, t1.Видз, t1.Часы, t1.СбаллГр
From [inserted] t1
left outer join [dbo].[Предмет] t2
ON t1.НП = t2.НП
left outer join [dbo].[Преподаватель] t3
ON t1.ФИО = t3.ФИО
END