|
Программирование >> Реализация баз данных
цедуру, которая одновременна ется триггером на обновление и добавление. Порядок этих событий в определении триггера не ограничен. Подробнее о синтаксисе триггеров рассказано в занятии 2. Есть определенные ельстза, при которых событие модификации или удаления данных не вызывает срабатывание ствующего триггера. Например, при исполнении оператора TRUNCATE ТАВЕЕ не происходит срабатывание DEEETE-триггера. Важной особенностью триггеров является автоматический откат неудачных транзакций. Поскольку TRUNCATE TABLE - непротоколируемое тие, его откат невозможен и оно не вызывает срабатывание DELETE-триггера, Кроме того, исполнение оператора WRITETEXT не вызывает срабатывания INSERT- и UPDATE-триггеров. Исполнение триггеров Триггер, запущенный в результате добавления или обновления табличных данных, СОХраняет новые или модифицированные данные в таблице под названием а триггер, сработавший при удалении данных из таблицы, сохраняет удаленные данные в таблице Deleted. С помошью команд ct-SQL выполняются запросы к эти щам которые существуют в памяти. Эта особенность важна для функционирования большинства триггеров: прежде чем внесенные изменения будут зафиксированы, задача триггера (например, модификация значения в связанной Таблице) сравнивает данные таблиц Inserted или Deleted с данными модифициронанной таблицы. Используя данные из таблиц Inserted или триггер может откатить транзакцию, если этого требуют бизнес-правила. В SQL Server 2000 существуют дна класса триггеров: INSTEAD OF и AFTER. Первые выполняются в обход действий, вызывавших их срабатывание, заменяя эти действия. НаПример, обновление таблицы, в которой есть триггер INSTEAD OF, вызовет срабатывание этого триггера. В результате вместе атора обновления выполняется код триггера. Это позволяет размешать в триггере сложные операторы обработки, которые дополняют действия оператора, модифицирующего таблицу. исполняются после действия, вызвавшего срабатывание триггера. Они считаются классом триггеров по умолчанию. Один триггер разрешается привязать к единственной таблице или представ.к.опо. Между триггерами этих двух классов твует ряд важных отличий, показанных в таблице. Характеристика INSTEAD ОГ-трштер АГГЕН-триггер Объект, которому можно привязать триггер Допустимое число триггеров Таблица или представление. Триггеры иатпч.!: тавлению, расширяют список типов обновления, которые может поддерживать представление В таблице или представлении допускается не одного триггера в расчете на одно действие. Можн .еля11-, представления для других представлений, каждое со своим собственным INSTEAD OF-триггером Таблица. AFTER-триггеры сраба-при ции данных в таблице в ответ на модификацию цредстааления К таблице можно привязать несколько AFTER- триггеров Занятие 1 Основные сведени!! о триггерах Характеристика INSTEAD OF-триггер АГГЕК-триггер Порядок Поскольку в таблице ил став- исполнения допускается не больше одного такого триггера в расчете на одно событие, порядок не имеет смысла Можно определять триг- срабатывающие первым и Для этого служит системная хранимая процедура sp settriggerorder. Порядок срабатывания других триггеров, привязанных к случаен К таблице разрешено привязывать триггеры обоих классов. Если в таблице определе-ограничения и триггеры обоих классов, то первым из них срабатывает триггер INSTEAD OF, затем обрабатываются отраничения и последним срабатывает ЛРТЕК-трпггер. При нарушении ограничения выполняется откат действий INSTEAD OF-триггера. Если нарушаются ограничения или происходят какие-либо другие события, не позволяющие модифицировать таблицу, AFTER-триттер не исполняется. Как и в случае хранимых процедур, глубина вложенности триггеров достигает 32 уровней, также возможно рекурсивное срабатывание триггеров. Чтобы получить более подробные сведения о вложенности и рекурсии триггеров, найдите в справочнике по языку Transacl-SQL в SQL Server Books Online страницу, озатлавленную СВЕАТЕ TRIGGER . Упражнение. Применение ограничений каскадной ссылочной целостности В этом упражнении вы добавите ограничения каскадной ссылочной целостности к базе данных BookShopDB. Эта новая функция SQL Server 2000 заменила триггеры при выполнении каскадного удаления и обновлении внешних ключей. ссылочной целостиости для ключа TitlelD из базы данных Настройка каскадной BookShopDB Откройте Query Analyzer и подключитесь к локальному серверу. На панели Editor в окне Query введите и исполните следующий код: USE BookShopDB INSERT Orders (CustomerlD, EmployeelD, Amount, OrderDate, DeliveryDate, PaymentiD, tatusID) VALUES no, 1, 30. GetDateO, DATEADD(day, 5, GetDateO). 1, 1} INSERT BookOrders (tltleid, orderid) VALUES (aust1234-, 3) Первый оператор INSERT добавляет новый заказ в таблицу Orders. Значения OrderDate и DeliveryDate предоставляют функции. Первая возвращает сегодняшнюю дату (установленную на компьютере). Вторая функция прибавляет 5 дней к значению функции GetDate. Второй оператор INSERT добавляет запись в таблицу BookOrders. Эти операторы добавления имеют большое значение для проверки действия эффекта каскадной ссылочной целостности на внешний ключ TitlelD в таблице BookOrders. 27 Глава 9 3. На панели Editor в окне Query и исполните код: UPDATE Books SET . . .. = Аизлгзб , WHERE TitlelD = AUSTISS На вкладке Message панели Results выводится сообщение об ошибке: Servers 547, Level 16, State 1, Line 1 UPDATE statement conflicted w:th COLUMN REFERENCE constraint titleid.fk. The conflict occurred in database BookShopDB . table fiookAuthors, column TitlelD. The statement has been termihit&d. Причиной такого сообщения является нарушение foreign key при попытке изменения значения первичного ключа TitlelD в таблице Books. 4. На панели Editor в окне Query введите и исполните следующий код: ALTER TABLE BookAuthors DROP CONSTRAINT l,ltleid fk Этот оператор ALTER TABLE удаляет из таблицы BookAuthors ограничение 5. На панели Editor в окне Query введите и исполните даю щи ii код: ALTER TABLE BookAuthors ADD CONSTRAINT titleid fk FOREIGN KEY (TitlelD) REFERENCES Books (TitlelD) ON UPDATE CASCADE ON DELETE CASCADE Этот оператор ALTER TABLE добавляет каскадную ссылочную целостность к ограничению foreign key ltitleid fl<) в таблице BookAutliors. При обновлении первичного ключа TitlelD из таблицы Books будет изменен и соответствующий внешний ключ в таблице BookOrders. Ограничение titieitLfk делает таблицу Books родительской для таблицы BookAuthors. , 6. Исполните код Transact-SQL. 7. На панели Editor в окне Query введите и исполните следующий код: UPDATE Books SET TitlelD ДиЗТТгЗб WHERE TitlelD = AUST1234 Выводится об ошибке из-за нарушения ограничения в таблице BookOrders при попытке изменения значения первичного ключа TitlelD в таблице Books. 8. На панели Editor в окне Query введите и исполните следующий код: ALTE BLE BookOrders DROP CONSTRAINT titleid2 fk ALTER TABLE BookOrders ADD CONSTRAINT titleid2 fk FOREIGN KEY (TitlelD) REFERENCES Books (TitlelD) ON UPDATE CASCADE ON DELETE C/\SCADE
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |