|
Программирование >> Реализация баз данных
FROM inventory inv, inserteJ ins . - WHERE inv. ite nuni - ins. itijmnuri END ELSE IF EXISTS (SELECT iterr uini from deleted) BEGIN UPDATEifiventory * SET retail price = (SELECT (SUM(pur.total cost)/SUM(pur.qty ordered) E3G) FROM purchasing pur INNER JOIN deleted del ON pur.item nuni - del.itein nvr]n) . FROM inventory inv, deleted del WHERE inv. iteni nu[t?=del. item,num = , END ELSE BEGIN RAISERROR (The retail prioe has not been adjusted for the product., 16, RETURN , - END В триггере применен оператор SET NOCOUNT ON, когда триггер срабатыва- ет и обновляет данные в Inventory, результаты оператора SELECT не выводят- СЯ. Далее выполняется проверка существования таблиц Inserted или Deleted. Если ни в одной из этих таблиц нет записей, то с noMoitibio системной команды RAISERROR триггер выводит стандартное сообщение о том, что значения цен не В системную таблицу SysMessages также можно добавить пользовательское средствами а затем вместо текста созданного сообщения указать его номер. Создание записей аудита. Для обеспечения безопасности или просто для отслеживания операций, ныполняемыхнадтаГ)лицей (шш таблицами), в базе данных можно создать триггер. Он собирает в таблиш-данные, добавленные, модифицированные или удаленные из другой таблицы или представления. Вызо , действий. В триггере разрешается задавать действия, выходящие за пре- делы стандартной обработки данных. Например, в занятии 2 мы показывали пример использования в триггере расширенной хранимой процедуры которая посылает почтовое при срабатывании триггера. Реализация сложной зашиты целостности данных. Порой стандартных мер по защите целостности данных недостаточно. Например, операцией каскадного удаления можно удалить записи из других в то время как простое удаление целостность между этими таблицами. Однако каскадное удаление может оказаться нежелательным. Тогда вместо него для удаления записей из связанных таблиц используют INSTEAD OF-триггер, а удаленные записи размещают в другой таблице : = последующей проверки. Если для удаления записей применяется INSTEAD OF-триггер, то реализовать операцию удаления с помощью каскадной ссылочной целостности не удастся. Чтобы выполнить ту lyio задачу, необходимо запрограммировать операцию каскадного удаления в триггере. ► Создание ера INSERT для таблицы BookOrders 1. Откройте Query Analyzer и подключитесь к локальному серверу. 2. На панели Editor в окне Query введите и исполните юш и й код: CREATE TRIGGER dbo. update b09k status ON dbo. bookorders AFTER INSERT AS UPDATE books SET Sold = 1 WHERE titleld = (SELECT bo.tltleid FROM bookorders bo INNER JOIN inserted i ON ho.orderid = i .ordPid) Оператор CREATE TRIGGER создает триггер под названием ook Statm и привязывает его к таблице BookOrders из базы данных BookShopDB. Этот триггер срабатывает при добавлении данных к таблице BookOrders и обновляет значение поля Sold с соответствующим номеров UeiD в таблице Books. ► Добавление в триггер обработка ения и обновления данных таблицы BookOrders 1. На панели Editor в окне Query введите и исполните код: ALTER TRIGGER ON dbo.bookorders AFTER INSERT, DELETE SET NOCOUNT ON IF EXISTS (SELECT * FROM inserted) BEGIN UPDATE books SET Sold = 1 WHERE titleid = (SELECT bo.tltleid FROM bookorders bo INNER JOIN inserted i ON bo.orderid = i.orderid) END ELSE BEGIN UPDATE books SET Sold = 0 INHERE titleid = Упражнение 3. Создание триггера для обновления значения столбца В этом упражнении вы создадите и проверите триггер, который записывает значение 1 в столбец Sold таблицы Books из базы данных BookShopDB. Вы также запрограммируете дополнительную обработку, которая приведет столбец Sold в исходное состояние, поместив в него значение 0, если заказчик вернет книгу. 294 TPXP Глава 9 (SELECT d.titleid ., . FROM books b INNER JOIh deleted d . . . ON b.titleid = d.titleid) Оператор ALTER TRIGGER модифицирует триггер Update Book Status и привязывает его к таблице BookOrders базы данных BookShopDB В третьей етроке поеле оператора INSERT чппрогряммпроваг о событие DELETE. При удалении данных из таблицы BookOrders этот триггер ываез и заносит значение 0 в поле Sold с соответ-CTByKJiiiHw luiLiu. Учет возврашаемы\ книг очень важен для бизнее-логики. Обратите внимание, что оператор SELECT в условии удаление i конструкции ELSE) сопоставляет значения TitlelD из таблиц Books и Deleted. Это необходимо, поскольку удаленных записей оол1 тс нет в raGjmue BookOrders. 2. Приведенный код не обрабатывает обновление должным образом. Единственное обновление, которое имеет отношение к таблице Books, - это обновление столбца Title ID в таблице BookOrders. Даже если в таблице BookOrders изменится значение OrderlD, то значение поля Sold в записи я данной книги все равно должно остаться равным 1. Чтобы обеспечить возможность обработки обновления значения TitlelD. на панели Editor в окне Query введите и исполните следующий код: ALTER TRIGGER dbo. update.bookstatus ONdbo.bookorders AFTER INSERT, UPDATE, DELETE AS SET NOCOUNT ON IF EXISTS (SELECT * FROM inserted) BEGIN UPDATE books . , SET Sold = 1 WHERE titleid = (SELECT bo.titleid FROM bookorders bo INNER JOIN inserted i ON boorderid = i.orderirt) IF EXISTS (SELECT * FROM deleted) BEGIN UPDATE books SET Sold 0 WHERE titleid = (SELECT d.titleid FROM books b INNER JOIN deleted d ON b.titleid = d.titleid) При модификации в триггер включены конструкции UPDATE. Обратите внимание на отсутствие конструкции ELSE. Событие UPDATE всегда создает обе псевдотаблицы -Inserted и Deleted. Поэтому в пе]Звой части кода в записи с новым TitlelD полю Sold
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |