Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы Данных Теор. Экзамен.doc
Скачиваний:
73
Добавлен:
20.05.2015
Размер:
1.93 Mб
Скачать

Тема10. Триггеры как механизм поддержки семантической целостности в бд

  1. Приведите формат оператора создания триггера. Чем отличаются триггера After и Insdead of? Какой командой можно запустить триггер? Простейший оператор создания триггера типа DML имеет вид:

CREATE TRIGGER имя_триггера

ON [таблица | представление ]

[ WITH ENCRYPTION ]

{

{FOR | AFTER | INSTEAD OF }{[DELETE] [,] [INSERT] [,] [UPDATE] }

[WITH APPEND]

[NOT FOR REPLICATION]

AS

{ IF UPDATE (столбец_i)

[ {AND | OR} UPDATE (столбец_j)]

[ … n]

| IF (COLUMNS_UPDATED() {побитовый_оператор} битовая_маска )

{оператор_сравнения} битовая_маска_столбца [… n ]

}

инструкции_SQL [ … n ]

}

} В параметре FOR задается тип триггера AFTER (после выполнения операции модификации) и INSTEAD OF (вместо выполнения операции модификации) . Триггер AFTER запускается после успешного завершения SQL. Триггер типа INSTEAD OF запускается вместо операции модификации

  1. Могут ли быть параметры триггера и как они ему передаются?

ALTERprocskolko@idint,@sumintoutputasif exists (select * from sotr where ID_Poraz = @id)select @sum = COUNT(*) from sotr where ID_Poraz = @idelse select @sum = 0print @sumтут входной айди - задает номер отдела, а выходному "сум" присваетвается значение = количеству работников отдела

  1. Что такое DRIи какое отношение эта аббревиатура имеет к триггерам? Как согласуется понятие DRI и механизм срабатывания триггеров, приведите примеры.При написании триггеров всегда надо помнить об этом, потому что при нарушении правил целостности по связям (DRI Declarative Referential Integrity) триггер просто может никогда не сработать.CREATE TRIGGER DEL_EXEMP ON dbo.EXEMPLAR

/* мы создаем триггер для таблицы EXEMPLAR */

FOR DELETE /* только для операции удаления */

AS

/* опишем локальные переменные */

DECLARE @Ntek int /* количество оставшихся экземпляров удаленной книги */

DECLARE @DEL_EX VARCHAR(12) /* шифр удаленного экземпляра*/

Begin /* по временной системной таблице, содержащей удаленные записи, определяем шифр книги, соответствующей последнему удаленномуэкземпляру */

SELECT @DEL_EX = ISBN From deleted

/* вызовем хранимую процедуру, которая определит количество экземпляров книги с заданным шифром */

EXEC @Ntek = COUNT_EX @DEL_EX

/* Если больше нет экземпляров данной книги, то мы удаляем запись о книге из таблицы BOOKS */

IF @Ntek = 0 DELETE from BOOKS WHERE BOOKS.ISBN = @DEL_EX

END

При наличии данных в подчинённых таблицах, триггер сработает некорректно.

CREATE TRIGGER DELL_BOOKS

ON [dbo].[BOOKS]

-- задали тип триггера

INSTEAD OF DELETE

AS

-- опишем переменную, в которую поместим шифр удаляемой книги

declare @ISBN varchar(14)

-- используя системную таблицу Deleted определеим значение шифра -- удаляемой книги и присвоим его нашей внутренней переменной @ISBN

Select @ISBN=ISBN from Deleted

-- удалим сначала из подчиненных таблиц все записи с заданным

-- значением шифра книги

Delete from BOOKS_CAT where BOOKS_CAT.ISBN=@ISBN

Delete from Relation_93 where RELATION_93.ISBN= @ISBN

-- Теперь удалим книгу

Delete from books where Books.isbn= @ISBN

Верный вариант, который согласует всё это с DRI.