Программирование баз данных MS SQL Server (1084479), страница 99
Текст из файла (страница 99)
Предположим, например, что с помощью представления достаточно лишь получить данные о сбыте за вчерашний день. Для этого достаточно ввести в запрос небольшие изменения, как показано ниже. 388 Глава 10 о.огбегоаге, об.Ргобзсь10, р.ргобисьнаее, об.осяаьтьу, об.пп1ГРгтсе, об.Оиапь1ьу * об.оя1СРгтсе АЯ ЕхьеабебРг1се РВОМ Сияьоаегя АЯ си 1ИМЕК 001И Огбегя АЯ о ОМ си.ссяьоаег10 = о.ссяьоаег10 1ММЕВ 001И (Огбег Оесаг1я] АБ об ОИ а.огбег10 = об.огбег10 1ММЕК 301М Ргобссся АЯ р ОИ об.Ргобась10 = р.Ргобссь10 МНЕВЕ СОИЧЕКТ(оагсэаг(12),о.огбегоасе,101) СОИЪЕВТ(нагсьаг(12),ОАТЕА00(бау,-1,0ЕТОАТЕ()),101) К сожалению, все даты, которые хранятся в базе данных ИогСАМЬпб, относятся к давно прошедшему времени, поэтому запрос к данному представлению вряд ли возвратит какие-либо данные, поэтому введем строку для проверки рассматриваемого представления.
Вызовите один раз на выполнение следующий сценарий: ОЯЕ Иоггьн1пб ОЕСЬАВЕ 61бепс 1пь 1МЯЕВТ 1МТО Огбегя (Сиясоаег10,огбегпасе) ЧАЬОЕЯ ('А1.РК1', ОАТЕА00(бау,-1,ОЕТОАТЕ())) БЕЬЕСТ 61бесь = 6610ЕИТ1ТУ 1ИЯЕВТ ХМТО (Огбег Оеса11я] (Огбег10, Ргобссс10, Оптсргтсе, ОоапГЬГу) ЧАЬОЕЯ (61с(егг, 1, 50, 25) БЕЬЕСТ 'ТАе Огбег10 от Сье 1ИЯЕВТеб гон 1я ' + СОМЧЕВТ(чагсааг(8),61бепь) В этом сценарии используются конструкции, которые будут более подробно описаны в главе, касающейся сценариев и пакетов. А на данный момент отметим, что этот сценарий позволяет ввести в базу данных Мосс]1МЬпб такие значения. выборка которых должна быть осуществлена с помощью представления.
После выполнения указанного сценария в программе Мапакешеп( о(пб]о должен появиться результат, который выглядит примерно так: (1 гон(я) а11есгеб) (1 гон(я) агтесьеб) Тье Огбег10 от Сне 1МБЕВТеб гон гя 11087 (1 гон(я) агтесьеб) ьледуегл учитывать, что некоторые из МРиведенных здесь сотйеений полвятсл во вкладке Меяяадея, только если п]зоерозхиа Мапаеятеп( о(ийо зкснлуотифуппсл в режиме отображения результатов в сетке, г)еяи](Б ]и Вг]с(. Представления 389 При выполнении этого примера на другом компьютере значение Отбет1Р может измениться, но остальная часть результатов должна остаться в основном такой же. Теперь выполним запрос применительно к рассматриваемому представлению, чтобы узнать, каковы будут результаты: 5ЕЬЕСТ Совраоунаке, Отбетто, Отбетоате ГЕРМ уезтетбаузотбетэ чк Полученнляе результаты действительно показывают, что в базе данных появилась информация о заказе с номером 11087 за вчерашний день: Отбет10 Отбетоате Совраоукате 11087 А1ттебэ Еостетк1эте 2000-08-05 17:37:52.520 (1 ток(з) аттестеб) ""йа,следует:придавйуьпбольшого( Зиаиеиии,тому, что фактичеСИИ ПсяУиаинмв данн(ыа о Ио-,.
, МЭРаХЗахаааВ ОгтбЕта Р) бУДУ~ ОтЛИЧатЬая От ПРИаЕДаНИЫХ а КНИГЕ, ДаЛО И тОМ,''Чтп Втп ИОК ':мара ирй(оваивгаютоя системой':9вскольку 6тбега Рва о(олбец,:идентификаций) й завибит' ' от того, сколькпатрокуяа вотавлено атаблйцу иными саввами, й(ривйиолиеиий данного' арии()ра,читателем могут,6ьпь:оояучииы другие' иамаора заказов. . Функции патишп и сои(уивт Безусловно, оператор создания представления с конструкцией 001)(, приведенный в предыдущем разделе, сложнее тех операторов, которые рассматривались до сих пор, но все еще остается вполне доступным для понимания. В нем одна за другой добавляются таблицы и столбцы новых таблиц применяются в операциях соединения с соответствующими им столбцами тех таблиц, которые были указаны ранее. Как всегда, следует отметить, что соединяемые столбцы не обязательно должны иметь одинаковые имени.
Достаточно того, чтобы в этих столбцах находились данные, связанные друг с другом. Но поскольку рассматриваемый оператор соединения является все же относительно сложным, проанализируем, какие действия осуществляются в запросе, который поддерживает это представление. Наибольший интерес представляет конструкция ИИЕЕЕ этого оператора: ИНЕЕЕ СОКЧЕРТ(чатоьат(12),о.отбетОаге,101) СОНУЕКТ ( Л ( 12), ОАТЕАОО(бау, -1, ОЕТОАТЕ () ), 10Н В данной конструкции применяется единственная операция сравнения,но для получения требуемого результата предусмотрено несколько функций. На первый взгляд кажется, что достаточно лишь сравнить значение Отбетоасе в таблице Отбетз со значением ОЕТРАТЕ () (с нынешней датой) за вычетом одного дня (в данном случае функция РАТЕАРР применяется исключительно для выполнения операции вычитания с датами). С помощью функции РАТЕАРР можно складывать значения продолжительности любых промежутков времени (а вычитание выполняется, если используются отрицательные значения операндов этой функции).
Достаточно только указать, к какой дате должна применяться операция сложения, с помощью какой единицы времени измеряется продолжительность суммируемого промежутка времени (сутки, недели, годы, минуты и т.д.), и вызвать на выполнение эту функцию. 390 Глава 10 Поэтому внешне такая задача выглядит таким образом, что достаточно просто получить значение сегодняшней даты с помощью функции ОЕТОАТЕ (), а затем вычесть одни сутки с помощью функции РАТЕАОР. Но проблема состоит в том, что значение, полученное с помощью функции ОЕТРАТЕ (), включает текущее время суток, поэтому данному критерию сравнения будут соответствовать только те строки, относящиеся к предыдущей дате, которые содержат такое же значение времени суток с точностью до 3.
3333 миллисекунд, а вероятность такого совпадения весьма мала. Поэтому в операторе сравнения предусмотрено дополнительное уточнение и используется функция СО))ЧЕЕТ для исключения времени суток из обоих значений дат до выполнения операции сравнения. Таким образом, с помощью этого представления будет получена информация обо всех торговых сделках, происшедших в предыдущую дату в любое время.
Использование представлений для внесения изменений в данные до ввода в действие триггеров 1натжлп ог Как уже было сказано, с точки зрения функциональных возможностей их использования представления почти полностью аналогичны таблицам (хотя, разумеется, для создания представлений применяются совсем другие конструкции по сравнению с таблицами). Но в этом разделе основное внимание уделено тому, в чем состоят функциональные различия между таблицами и представлениями. Многие начинающие разработчики об этом не догадываются, но следует знать, что к представлениям могут успешно применяться операторы 1Г)БЕАТ, ОРРАТЕ и РЕЬЕТЕ. Тем не менее при использовании операций модификации данных с помощью представлений необходимо учитывать некоторые нюансы, описанные ниже.
(3 Если оператор выборки, лежащий в основе представления, содержит операцию соединения, то в большинстве случаев с помощью этого представления невозможно вставлять или удалять данные, применяя оператор 1))БЕАТ или ОЕЬЕТЕ, если при этом не используется триггер 1)(БТЕАО ОЕ. В некоторых случаях оператор ОРОАТЕ может применяться без триггера 1)(БТЕАО ОЕ (например, при условии, что обновляются только те столбцы, которые относятся к одной и той же таблице), но требуется некоторая дополнительная подготовка, так как в противном случае прн выполнении операторов обновления могут вскоре возникнуть проблемы. (3 Если представление ссылается только на одну таблицу, то вставка данных с помощью оператора 1г)БЕАТ с использованием представления может осуществляться без применения триггера 1нзтеАО Ое, при условии, что в представлении обеспечивается доступ ко всем обязательным (не допускающим неопределенных значений) столбцам таблицы или для этих столбцов заданы применяемые по умолчанию значения.
Если же в таблице имеется столбец, который не определен в представлении и не имеет заданного по умолчанию значения, то при использовании триггера 1)(БТЕАО ОР применение оператора 1)(БЕАТ допускается даже в случае представлений, относящихся к единственной таблице. Ь) Предусмотрена возможность, хотя и в ограниченной степени, регламентировать, какие данные могут и не могут быть вставлены или обновлены в представлении. Представления 391 Как показывает приведенное описание условий модификации данных с помощью представлений, во многих случаях невозможно обойтись без триггеров 1ИЯТЕАО ОЕ. Но мы пока не можем продолжить описание этой темы, поскольку сами триггеры 1ИЯТЕАО ОЕ являются достаточно сложными объектами и к тому же в предыдущих главах данной книги еще не было приведено достаточно подробное описание триггеров. Автор уже неоднократно указывал, что при описании проблематики, связанной с СУБД Я(зЕ Яегчег, часто приходится сталкиваться со старой дилеммой "курицы" и "яйца" (что появилось раньше?).
Автор обязан раскрыть тему триггеров 1ЯБтеАР ОГ, поскольку она имеет непосредственное отношение к представлениям, но на страницах этой книги нельзя переходить к описанию триггеров 1ИЯТЕАО ОЕ, не изложив все необходимые сведения о тех объектах, на которых они создаются (речь идет о таблицах и представлениях). Поэтому автор решил в этой главе раскрыть тематику представлений в том аспекте, в каком эти объекты применялись с самого начала, еще до введения таких конструкций, как триггеры 1ИБТЕАО ОЕ.
Но хотя при изучении настоящей главы читатель не будет знакомиться с конкретными сведениями о триггерах 1ИБТЕАО ОЕ, он должен хорошо понимать, в чем состоит назначение этих триггеров. Таким образом, ознакомившись в данной главе с кратким обзором триггеров 1ИБТЕАО ОГ, мы снова вернемся к этой теме и раскроем ее более подробно в главе 15. Но самая главная особенность т(зиггфов 11чЯТЕАО ОЕ должна быть отмечена в данной главе.
Это — т)пгггфы особого)зада, котфые по существу вызываются на выполнение "вместо" йпзгеай о), отсюда их название) пзого опе~апифа, хото~ый вызвал запусх т)зиггфа, Благода)зя спокой фганизаиии (заботы после запуска т)зиггфа можно оп)зедглить, какие действия уже были выполнены с помошью опфатфа, а затем непофедппвенно в ходе тфиггфа пупгнлть (зешения, касающиеся того, как )зофешить любые возникшие конфеикты или уст)занить д(зугие п)зоблемьк хотфые, возможно, п(заявились к этому моменту. Таким об)зовом, т(зиггфы 1?ЗБТЕАО ОЕ являются очень мощньипи, но вместе с тем довольно сложными, поэтому отложим их описание до одной из следующих глав.