Популярные услуги

Триггеры

2021-03-09СтудИзба

1.   Триггеры

2. Назначение триггеров

Триггер – это инструмент SQL-сервера, используемый для поддержания целостности данных в базе. Триггеры представляют собой специальный класс хранимых процедур, автоматически запускаемых при добавлении, изменении и удалении данных из таблицы. Каждый триггер привязывается к конкретной таблице. Когда пользователь пытается изменить данные в таблице, сервер автоматически запускает триггер, и только при его успешном завершении разрешается выполнение изменений. Триггеры применяются для обеспечения целостности данных и выполнения бизнес-правил, слишком сложных для реализации ограничений.

 В отличие от хранимых процедур, триггеры нельзя вызывать напрямую, в них нельзя передавать параметры. Главное их преимущество в том, что они могут содержать сложную логику обработки. С помощью триггеров осуществляются каскадные изменения данных, что позволяет сократить объем кода для обновления данных в связанных таблицах и обеспечить синхронность изменений во всех таблицах. 

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

Триггеры не возвращают наборы результатов. Это связано с тем, что операторы  INSERTUPDATE и DELETE   не должны возвращать наборы результатов. Как и   хранимые процедуры, триггеры содержат операторы  языка Transact-SQL.

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

· триггеры изменения (запускаются при попытке изменения данных с помощью команды UPDATE);

· триггеры вставки (запускаются при попытке вставки данных с помощью команды INSERT);

Рекомендуемые материалы

· триггеры удаления (запускаются при попытке удаления данных с помощью команды DELETE).

При работе с триггерами доступны две специальные таблицы: таблиц вставок (INSERTED) и таблица удалений (DELETED) со структурой идентичной структуре таблицы, с которой связан триггер.

При выполнении операции DELETE строки, удаленные из модифицируемой таблицы помещаются в таблицу    DELETED. При выполнении операции INSERT строки, добавленные в модифицируемую таблицу, помещаются в таблицу INSERTED. При выполнении операции UPDATE исходное значение строки для каждой измененной строки ее исходное значение  помещается в таблицу DELETED, а новое значение – в таблицу INSERTED. Данные таблиц INSERTED и DELETED можно использовать в триггере.

3. Создание триггеров

Для создания триггеров используется оператор CREATE TRIGGER. В коде оператора указывается таблица, в которой следует создать триггер, а также операторы, включаемые в триггер.

Пример 1. Создадим  триггер для поддержки целостности данных – проверки наличия связанной записи в главной таблице при вводе данных в подчиненную таблицу (структура БД – см. рисунок 9) .

При вводе номеров зачеток в таблицу USP, необходимо  проверить наличие этого значения в поле Nom_Zach таблицы STUDENTS. Создаваемый триггер не позволит добавить новую запись в таблицу USP, если значение в поле  Nom_Zach не совпадает  ни с одним  значением в поле Nom_Zach таблицы STUDENTS.

Для создания триггера с именем INSCHECK c помощью утилиты SQL Server Enterprise Manager необходимо выбрать таблицу USP  в списке объектов базы данных, затем выполнить команду All tasks/Manage Triggers меню Actions. После этого будет открыто диалоговое окно свойств триггера (Trigger Properties), в которое необходимо ввести текст процедуры:

CREATE TRIGGER INSCHECK ON USP

FOR INSERT

AS

DECLARE @X

SELECT @X= Nom_Zach FROM                       INSERTED

  IF NOT EXISTS (SELECT * FROM

                              STUDENTS  WHERE Nom_Zach =@X)

BEGIN

    ROLLBACK TRANS

    RAISERROR(‘ОШИБКА ЦЕЛОСТНОСТИ!’,16,10)

END

Триггер активизируется при вставке (ключевое слово INSERT) новой записи. После определения переменной @X ей  присваивается значение поля Nom_Zach добавляемой записи. В процессе использования триггера создается временная таблица INSERTED, хранящая в себе  добавляемые  значения начальной таблицы USP. С помощью оператора SELECT переменной @X присваивается значение поля Nom_Zach из таблицы USP, то есть значение поля  Nom_Zach вновь добавляемой записи.

Следующий шаг работы триггера – проверка наличия в  поле Nom_Zach таблицы STUDENTS значения переменной @X, то есть проверка допустимости вводимого значения. Если значение не найдено, то выполняется блок операторов, заключенных в области BEGIN …END. С помощью команды ROLLBACK TRANSACTION, используемой при работе с транзакциями, отменяется последняя операция. Оператор RAISERROR осуществляет выдачу системного сообщения об ошибке. Значения 16 и 10 определяют уровень критичности операции.

Пример 2. Создадим триггер для удаления всех подчиненных записей в таблице USP при удалении записи из главной таблицы STUDENTS. Если из таблицы STUDENTS удаляются данные, о каком либо студенте (например, при его отчислении), то должны удаляться все записи таблицы USP, у которых значение поля Nom_Zach соответствует значению поля Nom_Zach удаляемой из таблицы  STUDENTS записи.

В таблице STUDENTS создадим триггер DELCHECK следующего содержания:

CREATE TRIGGER DELCHECK ON STUDENTS

FOR DELETE

AS

DECLARE @X int

SELECT @X= Nom_Zach FROM  DELETED

IF EXISTS(SELECT *

                     FROM     USP

                    WHERE       Nom_Zach = @X)

 DELETE FROM USP WHERE Nom_Zach =@X

В первой строке кода создается новый триггер с именем DELCHECK для таблицы STUDENTS, активизирующийся при удалении записи. Следующим шагом является определение переменной @X, которая будет содержать значение поля Nom_Zach удаляемой записи. Затем с помощью оператора SELECT данной переменной присваивается значение поля Nom_Zach удаляемой записи, находящейся в таблице DELETED. С помощью оператора EXISTS проверяется наличие записей в таблице USP, у  которых в поле Nom_Zach находится значение @X. Если такие записи найдены, то система выполняет  их удаление.

Пример 3. Триггер осуществляет проверку введенной в таблицу USP оценки.

CREATE TRIGGER USP__INPUT

ON USP

FOR INSERT, UPDATE

AS

DECLARE   @Mark

SELECT  @Mark = Mark  FROM INSERTED

IF (@Mark<2)Or (@Mark>5)

BEGIN

    RAISERROR ('оценка должна находиться в диапазоне от 2 до5’)

    ROLLBACK TRANSACTION

END

Пример 4. Триггер для увеличения стипендии на 10% тем студентам, которые сдали зачет по спецкурсу (код предмета PKod=1278).

CREATE TRIGGER UPDATE_ STIP

ON USP

FOR INSERT

AS

DECLARE @X int

DECLARE @Z int

DECLARE @P int

DECLARE @Y varchar(10)

select @X= Nom_Zach From INSERTED

select @Y= Mark From INSERTED

select @Z= PKodFrom INSERTED

select @P= Nom_Zach From  USP

Where Nom_Zach = @X

if(@Y=   'зачтено' AND @Z=1278)    

BEGIN

UPDATE STUDENTS

SET Stip = Stip*1.1

WHERE Nom_Zach=@P

END

Следующие триггеры созданы для БД “Продажа объектов недвижимости”. Реляционная модель данных приведена на рисунке 8.

Пример 5.Создать триггер для уменьшения цены квартиры на 5%, если при добавлении записи в таблицу VIEWING в поле  COMMENT занесено значение “требует ремонта”.

 CREATE TRIGGER UPDATE_PRICE

ON VIEWING

FOR INSERT

AS

DECLARE @X int

DECLARE @Y varchar(50)

select @X=Property_no From INSERTED

select @Y=Comments From INSERTED

if(@Y=   'требует ремонта')    

BEGIN

UPDATE PROPERTY

 SET Selling_Price=Selling_Price*0.5

FROM PROPERTY

WHERE Property_no=@X

END

Область применения триггеров не ограничивается какими-то строго очерченными рамками.  Триггеры можно применять по своему усмотрению, исходя из требований к удобству и производительности выполняемых действий. Не следует применять триггеры для выполнения простых проверок, которые могут быть произведены с помощью правил или ограничений целостности. Кроме того, следует избегать использования триггеров, если те же действия могут быть реализованы с помощью хранимой процедуры или обычного пакета команд Transact-SQL. Использование триггеров нежелательно еще и по той причине, что они блокируют таблицу до завершения триггера, запрещая обращение к ресурсу других пользователей.

4. Удаление триггера

После того как триггер стал ненужным или даже мешает работе, его следует удалить. Выполнение этой операции осуществляется с помощью команды DROP TRIGGER, имеющей следующий синтаксис:
DROP TRIGGER {имя триггера} [,...n]
 Так как имя триггера уникально в пределах базы данных, то указание имени таблицы не требуется. С помощью одной команды DROP TRIGGER можно удалить несколько триггеров, перечислив их имена через запятую.

5. КОНТРОЛЬНЫЕ ВОПРОСЫ

1. С какой целью создаются триггеры?

2. Как осуществляется запуск триггеров?

3. Могут ли триггеры возвращать наборы результатов?

4. Какие категории триггеров существуют?

Лекция "Последствия радиационных аварий и катастроф" также может быть Вам полезна.

5. Для чего служат таблицы INSERTED и DELETED? Как эти таблицы используются при выполнении операции обновления?

6. Какой оператор служит для создания триггеров?

7. Объясните работу триггеров, приведенных в примерах.

8. Следует ли создавать триггеры в  тех случаях, когда проверка может быть выполнена с помощью ограничений или правил?

9. Какой оператор служит для удаления триггера?

10. Можно ли удалить одновременно несколько триггеров?

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5173
Авторов
на СтудИзбе
437
Средний доход
с одного платного файла
Обучение Подробнее