Lab9-10_SQL (1059137), страница 2

Файл №1059137 Lab9-10_SQL (Лабораторная №9-10) 2 страницаLab9-10_SQL (1059137) страница 22017-12-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 2)

Чтобы получить представление о работе этого триггера, мы создадим триггер DELETE, предназначенный для предотвращения удаления пользователями данных о клиентах, которые живут в штате Аризона (этот код практически не отличается от кода предотвращения удаления пользователями записей клиентов с завышенным кредитом).

  1. Откройте SQL Server Management Studio и раскройте папки сервера Databases=> Sales=>Tables=> dbo.Customers.

  2. Щелкните правой кнопкой на папке Triggers и выберите команду New Trigger.

  3. В строке CREATE TRIGGER введите имя триггера (AzDel), в строке ON введите имя таблицы (dbo.Customers).

  4. В строке AFTER оставьте DELETE (удалите Update и Insert).

  5. В поле (--Insert statements for trigger here) введите следующий код триггера (рис. 4).

IF (SELECT state FROM deleted) = 'AZ'

BEGIN

PRINT 'Cannot remove customers from AZ'

PRINT 'Transaction has cancelled'

ROLLBACK

END

  1. Для создания триггера щелкните на кнопке Execute.

Рис. 4. Создание триггера на удаление

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

1. Откройте новый запрос SQL Server и выполните следующий код проверки наличия клиентов из Аризоны (в частности, клиент Shane Travis должен жить именно там) (рис. 5):

USE Sales

SELECT * FROM customers

Рис. 5. Проверка состава клиентов из Аризоны

2. Чтобы триггер сработал, попытайтесь удалить запись о клиенте Shane Travis из таблицы клиентов. Для этого используйте команду New Query меню Query и выполните следующий код (он должен выдать сооб­щение об ошибке) (рис. 6):

USE Sales

DELETE from customers

WHERE lname = 'Travis'

Рис. 6. Получено сообщение о блокировке операции триггером

3. Дабы убедиться в том, что запись о клиенте Shane Travis не была удалена, введи­те и выполните следующий код (в результатах вы должны увидеть эту запись):

USE Sales

SELECT * FROM customers

4. Закройте окно запросов.

Таким образом мы создали триггер DELETE, который использует логическую та­блицу deleted, чтобы проверить, не пытаетесь ли вы удалить данные о клиенте из Аризоны. Если вы пытаетесь удалить такие данные, то получите отказ в виде сообще­ния об ошибке (генерируемого инструкцией PRINT, введенной в код триггера).

Теперь, после изучения внутренней работы триггеров INSERT и DELETE, вам будет легче понять принцип действия триггеров на обновление (UPDATE).

Триггеры UPDATE

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

Метод, используемый триггером UPDATE, представляет комбинацию методов, применяемых триггерами INSERT и DELETE. Помните, что триггер INSERT использует таблицу inserted, а триггер DELETE— таблицу deleted.

Триггер UPDATE использует обе эти таблицы. Дело в том, что действие UPDATE представляет собой два отдельных действия — удаление и вставку. Вначале удаляются существующие данные, а затем вставляются новые. Таким образом, при модифика­ции пользователем данные полностью удаляются и заменяются.

Мы воспользуемся преимуществами триггера UPDATE, чтобы предотвратить продажу товаров сверх запасов. Сейчас пользователи могут делать заказы, даже если столбец instock таблицы Products будет принимать отрица­тельные значения. Мы создадим триггер, который будет проверять столбец instock таблицы Products на наличие остатков товара на складе на момент продажи.

  1. Откройте SQL Server Management Studio и раскройте папки сервера Databases=> Sales=>Tables=> dbo.Products.

  2. Щелкните правой кнопкой на папке Triggers и выберите команду New Trigger.

  3. В строке CREATE TRIGGER введите имя триггера (CheckStock), в строке ON введите имя таблицы (dbo.Products).

  4. В строке AFTER оставьте UPDATE (удалите Delete и Insert).

  5. В поле (--Insert statements for trigger here) введите следующий код триггера (рис. 7).

IF (SELECT InStock from inserted) < 0

BEGIN

PRINT 'Cannot oversell Products'

PRINT 'Transaction has been cancelled'

ROLLBACK

END



Puc. 7. Создание триггера на обновление



6. Для создания триггера щелкните на кнопке Execute.

Итак, мы создали триггер UPDATE и можем протестировать его, попытавшись продать один из товаров сверх запаса. Попытаемся непосредственно обновить одну из записей таблицы Products.

1. Откройте новый запрос SQL Server и выполните следующий код проверки ко­личества единиц доступного продукта (для продукта с идентификатором 8 зна­чение должно быть равно 545).

USE Sales

SELECT prodid, instock FROM Products

2. Чтобы сработал триггер UPDATE, мы попытаемся продать клиенту 600 единиц товара с идентификатором 8 (шерстяные одеяла). Откройте новый запрос SQL Server и выполните следующий код (он должен выдать сообщение об ошибке (рис. 8).

USE Sales

UPDATE Products

SET InStock = (Instock - 600)

WHERE prodid = 8

Рис. 8. Попытка продать товар сверх запасов вызвала ошибку

3. Чтобы удостовериться в отмене транзакции и наличии 545 шерстяных одеял
на складе, щелкните на кнопке New Query и выполните следующий код (вы
должны увидеть 545 единиц товара с идентификатором 8):

USE Sales

SELECT prodid, instock FROM Products

4. Закройте окно запросов.

Итак, мы создали триггер UPDATE, ссылающийся на таблицу inserted, для про­верки того, не пытаетесь ли вы вставить отрицательное значение. Вам нужно прове­рять только таблицу inserted, поскольку SQL Server выполняет все математические операции перед вставкой данных. В нашем случае перед вставкой данных в таблицу программа отняла значение 600 (новое значение) от 545 (существующее значение). Это означает, что таблица inserted всегда содержит новое значение, которое тре­буется проверять. Триггеры UPDATE представляют собой весьма мощное средство, однако их еще более удобно использовать с инструкцией IF UPDATE, которая приме­няется для проверки обновлений для отдельного столбца.

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

В качестве хорошего примера можно привести базы данных кадров с такой информацией о служащих, как фамилии, адреса, оклады и идентификационные коды. Большая часть этой информации со временем изменяется, но идентификационный код выдается на всю жизнь, и не должен меняться ни по каким причинам (если, конечно, он не был введен с ошибкой изначально). Инструкцию IF UPDATE можно использовать для проверки модификации этого столбца и отмены таких изменений.

В качестве примера мы создадим триггер UPDATE с использованием инструкции IF UPDATE. В этом триггере мы запретим изменения в поле с номером телефона.

  1. Откройте SQL Server Management Studio и раскройте папки сервера Databases=> Sales => Tables=> dbo. Customers.

  2. Щелкните правой кнопкой на папке Triggers и выберите команду New Trigger.

  3. В строке CREATE TRIGGER введите имя триггера (CheckPN), в строке ON введите имя таблицы (dbo. Customers).

Рис. 9. Создание триггера на изменение одного столбца


4
. В строке AFTER оставьте UPDATE (удалите Delete и Insert).

5. В поле (--Insert statements for trigger here) введите следующий код триггера (рис. 9).

IF UPDATE (phone)

BEGIN

PRINT 'Cannot change phone numbers'

PRINT 'Transaction has been cancelled'

ROLLBACK

END

6. Для создания триггера щелкните на кнопке Execute.

Теперь мы протестируем триггер IF UPDATE. Чтобы он сработал, мы попытаемся обновить номер телефона клиента.

1. Откройте новый запрос SQL Server и выполните следующий код проверки телефонных номеров в таблице Customers (номер телефона клиента Tom Smith должен быть 5105551212).

USE Sales

SELECT fname, lname, phone FROM customers

2. Чтобы сработал триггер UPDATE, мы попытаемся модифицировать номер телефона клиента Тот Smith. Откройте новый запрос SQL Server и выполните следующий код (вы должны получить сообщение об ошибке).

USE Sales

UPDATE customers

SET phone = '8881234567'

WHERE lname = ‘Smith'

3. Чтобы проверить отмену транзакции, введите и выполните следующий код.

USE Sales

SELECT fname, lname, phone FROM customers

4. Закройте окно запросов.

Примечание. Инструкцию if update можно использовать в триггерах insert и update. He пытайтесь использовать ее в триггере delete, поскольку при удалении столбцы не изменяются.

Итак, мы указали SQL Server проверять модификации в указанном столб­це. Все попытки изменить телефонный номер будут безуспешными. Инструкцию IF UPDATE можно использовать для решения многих задач — все зависит от вашего во­ображения.

Другим, не менее полезным триггером является триггер замены операции INSTEAD OF.

Триггеры INSTEAD OF

Представления можно применять для отобра­жения нескольких столбцов таблицы, поднабора строк таблицы или данных из нескольких таблиц. Они удобны для просмотра данных, однако при модификации данных через представление могут возникнуть проблемы.

Поскольку представления могут не отображать все столбцы таблицы, инструкции модификации данных могут не выполняться. Предположим, что у нас имеется таблица клиентов с такой информацией, как фамилия, адрес, город, штат, почтовый индекс и т.д. Затем представим, что мы создали представление, отображающее все столбцы, за исключением поля city. Если вы попытаетесь обновить таблицу клиен­тов через это новое представление, то обновление не будет выполнено, поскольку поле city (а оно обязательно) недоступно через представление. Использование триг­гера INSTEAD OF может сделать такой тип обновлений успешным.

В следующей последовательности действий мы создадим триггер INSTEAD OF, ко­торый будет вставлять в таблицу значение, недоступное в представлении. Для этого мы вначале создадим представление, не отображающее столбец city (обязательный для обновления), а затем попытаемся выполнить обновление этого столбца. Далее мы создадим триггер INSTEAD OF, который может вставлять отсутствующее значе­ние, и вновь попытаемся выполнить обновление.

Характеристики

Тип файла
Документ
Размер
4,92 Mb
Тип материала
Высшее учебное заведение

Список файлов лабораторной работы

Лабораторная №9-10
Add_City.sql
AzDel.sql
CheckPN.sql
CheckStock.sql
InvUpdate.sql
Sales.mdf
Sales_log.ldf
lab9-10.sqlsuo
lab9-10.ssmssln
Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6353
Авторов
на СтудИзбе
311
Средний доход
с одного платного файла
Обучение Подробнее