Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архив / Пособие_Триггеры и процедуры (MS SQL Server)

.pdf
Скачиваний:
261
Добавлен:
14.05.2015
Размер:
721.02 Кб
Скачать

ПетрГУ, кафедра прикладной математики и кибернетики

CREATE TRIGGER tgrStudentDelete ON tblStudent AFTER DELETE

AS

DECLARE @idFaculty int, @TotalSum int, @idGroup int;

DECLARE DelCursor CURSOR FOR Select GroupId FROM Deleted; BEGIN

OPEN DelCursor;

FETCH NEXT FROM DelCursor INTO @idGroup; WHILE @@FETCH_STATUS = 0

BEGIN

Select @idFaculty=FacultyId From tblGroup Where GroupId=@idGroup; EXECUTE prStudentsOfFaculty @idFaculty, @TotalSum OUTPUT; UPDATE tblFaculty SET FacultyStudent=@TotalSum WHERE

FacultyId=@idFaculty;

FETCH NEXT FROM DelCursor INTO @idGroup; END;

CLOSE DelCursor; Deallocate DelCursor;

END

Триггер tgrStudentInsert вызывается для операций Insert и Update, а триггер tgrStudentDelete – для операции Delete. Работают они одинаково, единственное отличие заключается в том, что при добавлении записей используется таблица Inserted, а при удалении – Deleted, поэтому триггеры отличаются только запросом для курсора.

Для каждой изменяемой (добавляемой/удаляемой) записи триггер узнает идентификатор группу, в которую зачислен студент, по этому идентификатору находит идентификатор факультета, на котором учится студент, вызывает процедуру, которая подсчитывает общее количество студентов на факультете, и вносит правильное значение в соответствующую строку таблицы tblFaculty.

В принципе, все действия можно было бы реализовать и в одном триггере с использованием функции EXISTS(). Но тело триггера было бы в два раза длиннее и в нем были бы все команды из двух триггеров.

CREATE TRIGGER tgrPrint

ON tblDelivery

AFTER INSERT,DELETE,UPDATE

AS

BEGIN

IF EXISTS(Select * from Deleted)

PRINT 'Deleted';

IF EXISTS (Select * from Inserted)

PRINT 'Inserted';

END

Конспект лекций по дисциплине «Базы данных» (Процедуры и триггеры)

21

ПетрГУ, кафедра прикладной математики и кибернетики

Пример 5

Генерация уникального идентификатора аудитории.

При добавлении новых данных в таблицу tblRoom необходимо указать значение идентификатора записи. Так как эти значения абсолютно условны, т.е. их не существует в предметной области, они были введены в структуру таблицы в качестве искусственного ключа, то не стоит утруждать пользователя в выдумывании этих значений. Эти значения должны генерироваться автоматически и быть уникальными. Для генерации нового значения воспользуемся механизмом триггера и будем использовать простейший алгоритм, заключающийся в нахождении максимального идентификатора для уже имеющихся в таблице tblRoom записей, и увеличении этого значения на единицу, таким образом, получим новое уникальное значение.

CREATE TRIGGER tgrRoomInsert

ON tblRoom INSTEAD OF INSERT

AS

DECLARE @idRoom int, @RNumber char(6), @RCount int, @RBoard boolean, @RFloor int;

DECLARE InsCursor CURSOR FOR Select RoomNumber, PlaceCount, SmartBoard, RoomFloor FROM Inserted;

BEGIN

OPEN InsCursor;

FETCH NEXT FROM InsCursor INTO @RNumber, @RCount, @RBoard, @RFloor;

WHILE @@FETCH_STATUS = 0 BEGIN

SELECT @idRoom = max(RoomId) from tblRoom; SET @idRoom=@idRoom+1;

INSERT INTO tblRoom (RoomId, RoomNumber, PlaceCount, SmartBoard, RoomFloor) VALUES(@idRoom, @RNumber, @RCount, @RBoard, @RFloor)

FETCH NEXT FROM InsCursor INTO @RNumber, @RCount, @RBoard, @RFloor;

END;

CLOSE InsCursor; Deallocate InsCursor;

END

Пусть таблица tblRoom содержит следующие записи: tblRoom

 

RoomId

RoomNumber

PlaceCount

SmartBoard

RoomFloor

 

 

 

 

 

 

 

 

 

1

105

27

1

1

 

 

 

 

 

 

 

 

 

3

201

14

0

2

 

 

 

 

 

 

 

 

 

7

203

30

0

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Конспект лекций по дисциплине «Базы данных» (Процедуры и триггеры)

22

ПетрГУ, кафедра прикладной математики и кибернетики

Если пользователь попытается выполнить следующую команду

insert into tblRoom(RoomNumber, RoomFloor) values(‘327a’, 3), (‘403’, 4)

таблица tblRoom станет такой: tblRoom

RoomId

RoomNumber

PlaceCount

SmartBoard

RoomFloor

 

 

 

 

 

1

105

27

1

1

 

 

 

 

 

3

201

14

0

2

 

 

 

 

 

7

203

30

0

2

 

 

 

 

 

8

327a

Null

Null

3

 

 

 

 

 

9

403

Null

Null

4

 

 

 

 

 

Для двух добавленных записей будут сгенерированы значения поля RoomId: 8 и 9 соответственно. Так как пользователь не указал значения для полей PlaceCount и SmartBoard, то эти поля получили значения NULL.

Конспект лекций по дисциплине «Базы данных» (Процедуры и триггеры)

23