CREATE TRIGGER InsertStudent

ON Students FOR Insert

AS

DECLARE @ID INT

IF @@ROWCOUNT=1

BEGIN

SELECT @ID=ID_Group

FROM INSERTED

BEGIN

IF 20>(SELECT Kol_stud

FROM Groups

WHERE ID_Group=@ID

)

BEGIN

UPDATE Groups

SET Kol_stud=Kol_stud+1

WHERE ID_Group=@ID

PRINT 'студент успешно добавлен в данную группу'

END

ELSE

BEGIN

ROLLBACK TRANSACTION

PRINT 'Группа переполнена!Выберите другую группу!'

END

END

END;

Пример 2. Создать триггер для обработки операции удаления записи из таблицы Students, например, такой команды:

DELETE FROM Students WHERE ID_Student=82;

При удалении студента из группы количество студентов в группе уменьшается на единицу:

CREATE TRIGGER TriggerDelete

ON Students FOR Delete

AS

DECLARE @ID INT, @ID_Grup INT

IF @@ROWCOUNT=1

BEGIN

SELECT @ID=ID_Group

FROM DELETED

UPDATE Groups

SET Kol_stud=Kol_stud-1

WHERE ID_Group=@ID

PRINT 'студент успешно удален из группы'

END;

17.6. Использование хранимых процедур
в триггерах

Хранимые процедуры могут быть активизированы не только пользовательскими приложениями, но и триггерами.

Пример 3.Создадим процедуру, обновляющую количество студентов в группе:

CREATE PROCEDURE UpdateKolStud

@group INT

AS

DECLARE @newKolStud SMALLINT

BEGIN

SELECT @newKolStud = COUNT(*) FROM Students WHERE ID_Group = @group

UPDATE Groups SET Kol_Stud = @newKolStud WHERE ID_Group = @group

END;

Теперь создадим триггер, который будет срабатывать при удалении студента из базы данных или добавлении студента в базу данных:

CREATE TRIGGER KolStudTrigger

ON Students

AFTER INSERT, DELETE

AS

DECLARE @gr1 INT, @gr2 INT

if @@rowcount = 1

BEGIN

SELECT @Gr1 = ID_Group FROM deleted

SELECT @Gr2 = ID_Group FROM inserted

IF (SELECT DISTINCT ID_Group FROM deleted) IS NOT NULL

EXEC UpdateKolStud @group = @gr1;

IF (SELECT DISTINCT ID_Group FROM inserted) IS NOT NULL

EXEC UpdateKolStud @group = @gr2;

END;

Вид таблицы до транзакции приведен на рис.1.

CREATE TRIGGER InsertStudent - student2.ru

Рис. 1 – Таблица Students

В группе № 4 обучается 24 человека.

Результат выполнения запроса приведен на рис. 2.

CREATE TRIGGER InsertStudent - student2.ru

Рис. 2 – Таблица Groups

Удалим студента № 7, который учится в группе № 4:

DELETE FROM Students WHERE ID_Student = 7;

После удаления записи о студенте количество студентов в группе уменьшилось на единицу.

Вид таблицы после выполнения транзакции приведен на рис. 3.

CREATE TRIGGER InsertStudent - student2.ru

Рис. 3 – Таблица Groups

Теперь вновь добавим удаленного нами студента:

INSERT INTO Students (FIO, Nomer_zachetki, ID_Group, Stipendiya) VALUES ('Макарь В.А.', '06ВП118', 4, 1200);

Результат выполнения запроса приведен на рис. 4.

CREATE TRIGGER InsertStudent - student2.ru

Рис. 4. Добавление строки в таблицу

Вид таблицы после транзакции приведен на рис. 5.

CREATE TRIGGER InsertStudent - student2.ru

Рис. 5 – Таблица Groups

Наши рекомендации