|
Программирование >> Реляционные базы данных
В предыд1ще\1 примере действие показано как единственный оператор SQL, но там могло быть любое число таких операторов, разделениь[х точкой с запятой. Когда вызывающим срабатывание триггера событием яапяется изменение, имеются старый и ковы11 кортежи, т.е. кортеж перед изменением и кортеж после изменения. В строкам (4) и (5) им присваиваются имена с помо1иью угючевых слов OLD AS и NEW AS. Если вызывающим срабатывание триггера событием является вставка, слова NEW AS используются для именования вводимого кортежа, а OLD AS запрещены. И наоборот, при удапеини слова OLD AS применяются для именования удаляемого кортежа, а слова NEW AS запрещены. При удалении ключевых слов FOR EACH ROW из строки (10) триггер уровня строки, описанный на рис. 6.7, становится триггером уровни предложения. Последний выполняется один раз для каждого предложения, генерирующего одно и более событий, вызывающих срабатывание триггера. Например, если вся таблица изменяется с помощью SQL-npeauioxenHfl, триггер уровня предложения выполняется только один раз, а триггер уровня кортежа выполняется по одному разу для каждого кортежа. В триггере уровня предложения невозможно прямо ссылаться на старые и новые кортежи, как это делалось в строках (4) и (5), а можно ссылаться только на множество старых кортежей (удаленных кортежей или старых версий измененных кортежей) и на мггожество новых кортежей (вставленных кортежей или новых версий измененных кортежей) как на два отношения. Значит, вместо строк (4) и (5) на рис. 6.7 мы пишем соответственно OLD TABLE AS OldStuff и NEW TABLE AS NewStuff, где OldStuff имя отношения, содержащего все старые кортежи, а NewStuff-имя отношения, содержащего новые кортежи. Пример 6.17. Допустим, нужно предотвратить падение среднего чистого дохода ад.министраторов ниже 500 тыс. дол. Такое ограничение может быть нарушено вставкой, удалением или изменением в столбце netWortti таблицы MovieExec(name, address, cert#, netWorth) Необходимо ввести по одному триггеру для каждого из этих событий. На рис. 6.8 показан триггер для изменения Триггеры для вставки и удаления похожи на него, хотя и более просты. 1) CREATE TRIGGER AvgNetWorthTrigger 2) INSTEAD OF UPDATE OF netWorth ON MovieExec 3) REFERENCING 4) OLD TABLE AS OldStuff 5) NEWTABLE AS NewStuff 6) WHEN(500000 <= 7) (SELECT AVG(NetWorth) 8) FROM ((MovieExec EXCEPT OldStuff) UNION NewStuff) ) 9) DELETE FROM MovieExec 10) WHERE(name,address.cert#, netWorth) IN OldStuff; 11) INSERT INTO MovieExec 12) (SELECT * FROM NewStuff); Рис. 6.B. Ограничение среднего чистого дохода Строки (3) -(5) означают, что NewStuff и OldStuff -это имена отношений, содержащих соответственно новые и старые кортежи, включенные в операцию БД, nызьиaюшiЮ срабатывание триггера. Заметим, что один оператор БД может изменять множество кортежей отношения и при его выполнении в NewStuff и OldStuff может входить множество кортежей. Если операцией является изменение, NewStuff и OldStuff - соответственно новые и старые версии измененных кортежей. В аналогичном триггере для удаления в OldSluff в.ход ши бы удаляемые кортежи и не было бы описания имени отношения NewStuff для NEW TABLE. В триггере для вставки новые кортежи входили бы в NewStuff и не было бы описания отношения OldStuff. Строки (6) - (8) - это условие, которое выполняется, если средний чистый доход noote изменения составляет не менее 500 тыс. дол. Заметим, что выражение в строке (8) вычисляет, каким должно быть отношение MovieExec, когда выполнено изменение. Но в строке (2) указано INSTEAD OF и поэтому пресекается любая попытка изменения столбца netWorth из отношения MovieExec. Изменение не выполняется никогда. Вместо этого триггер проверяет условие, чтобы решить, что предпринять дальше. В данном примере, если изменение не делает средний доход администраторов фильмов менее 500 тыс. дол., действие приводит к результату, который был целью изменения. А именно: строки (9) и (10) удаляют кортежи, предназначенные для изменения, а строки (II) и (12) вводят новые версии этих кортежей. □ 6.6.3 Утверждения в SQL3 Утверждения SQ1.2 в S0L3 расширяются в двух важных направлениях: 1. Утверждения вводятся в действие событиями, определенными програм- мистом, а не событиями, которые, согласно решению системы, могут нарушить ограничение. 2. По выбору утверждения могут относиться к каждому кортежу таблицы, а не к таблице или к таблицам в целом. Пример 6.18. Утверждение RichPres из примера 6.10 показано на рис. 6.9 в нотации SQL3. 1) CREATE ASSERTION RichPres 2) AFTER 3) INSERT ON Studio. 4) UPDATE OF presC# ON Studio, 5) UPDATE OF netWorth ON MovieExec. 6) DELETE ON MovieExec 7) CHECK (NOT EXISTS 8) (SELECT * FROM Studio. MovieExec 9) WHERE presC# = cert* AND netWorth < 10000000 ) Рис. 6.9. Утверждение S<pi3 Строка (I) - обычное начало описания. В строках (2) -(6) перечислены события, при которых утверждение вводится в действие. Напомним, что для пресечения всех возможных изменений БД. нарушающих ограничение, введенное в строках (7) - (9), нужно проверить каждого нового президента студии или изменение дохода некоторого администратора. Знач1гг, строки (3) и (4) инициируют выполнение утверждения при введении кортежа в Studio или при изменении номера сертификата президента студии (т.е. при смене президента). Строки (5) и (6) инициируют проверку при изменении чистого дохода любого администратора или при удалении администратора, так как при этом может нарушиться ограничение. Оно описано в строках (7) - (9), по существу, так же, как и в примере 6.10. П Главное различие между подходами SQL2 и SQL3 к утверждениям состоит в том, что на рис. 6.9 явно показано, когда нужно производить проверку. Поэтому утверждения SQI.3 более удобны для разработчика СУБД системь и менее удобны для пользователя по следующим причинам: 1. Патьзователь должен обнаружить все события, инициирующие проверку заданного ограничения. 2. Пользователь рискует привести БД я противоречивое состояние, если события выбраны неправильно, 6.6.4 Упражнения к разделу 6.6 Упрожнение 6.6.1. Запишите триггеры, аналоптные представленным на рис. 6.8, для событий вставки и удаления для MovieExec. Упражнение 6.6.2. Запишите следующие триггеры, или утверждения, SQL3, основанные иа примере РС из упражнения 4.1.1: Product(mal<er, model, type) PC(model, speed, ram. hd, cd. price) Laptop(model. speed, ram, hd, screen, price) Prlnter(model. color, type, price) *a) При изменении цены ПК не должно быть ПК с более низкой иеной и такой же скоростью процессора. Ь) При введении нового принтера установить, что номер его модели существует в отношении Product. !с) При любом изменении отношения Laptop средняя цена ПК-блокнотов любого производителя должна быть не меньше 2 тью. дол. !d) При изменении RAM гши жесткого диска любого ПК объем жесткого диска нового ПК лолжен превосходить объем его RAM минимум в 100 раз. !е) При введении нового ПК, ПК-блокнота или принтера номер его модели не должен входить в отношение РС, Laptop или Printer. Упрожнение 6.6.3. Для схемы БД упражнения 4.1.3 Classe3(class, type, country. numGuns. bore, displecement) Shlps{name, class, launched) Battles(name, date) Outcomes(ship, battle, result) запишите триггеры, или утверждения, S0L3. позволяющие выполнять следующие условия: а) При добавлении нового класса в отношение Classes в него вводится также корабль с именем этого класса и значением NULL вместо даты спуска на воду.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |