![]() |
|
Программирование >> Понятие sql
=============== SQL Execution Log ============== SELECT * FROM Citymatch; custcity salescity Berlin San Jose London London Rome London Rome New York San Jose Barselona San Jose San Jose Рисунок 21.1: Представление совпадения по городам Однако, то же самое значение будет произведено при совпадении Clemens из Лондона, с его продавцом, который также оказался с именем - Peel. Пока отличающиеся комбинации городов выбирались конкретно, только одна строка из этих значений была произведена. Даже если вы не получите выбора, используя отличия, вы все еще будете в том же самом положении, потому что вы будете тогда иметь две строки в представлении с идентичными значениями, то-есть с обоими столбцами равными Lоndon London . Эти две строки представления будут отличаться друг от друга, так что вы пока не сможете сообщить, какая строка представления исходила из каких значений базовых таблиц (имейте в виду, что запросы, не использующие предложение ORDER BY, производят вывод в произвольном порядке. Это относится также и к запросам, используемым внутри представлений, которые не могут использовать ORDER BY. Таким образом, порядок из двух строк не может быть использован для их отличий. Это означает, что мы будем снова обращаться к выводу строк, которыенемогут быть точносвязаны с указаными строками запрашиваемой таблицы. Что если вы пробуете удалить строку London London из представления? Означало бы это удаление Hoffmanаиз таблицы Заказчиков, удаление Clemens из той же таблицы, или удаление их обоих? Должен ли SQL также удалить Peel из таблицы Продавцов? На эти вопросы невозможно ответить точно, поэтому удаления не разрешены в представлениях такого типа. Представление Citymatch - это пример представления только чтение, оно может быть только запрошено, но не изменено. ОПРЕДЕЛЕНИЕ МОДИФИЦИРУЕМОСТИ ПРЕДСТАВЛЕНИЯ Если команды модификации могут выполняться в представлении, представление как сообщалось будет модифицируемым в противном случае оно предназначено только для чтения при запросе. Непротивореча этой терминологии, мы будем использовать выражение модифицируемое представление (updating a view), чтоы означает возможность выполнения в представление любой из трех команд модификации DML (Вставить, Изменить и Удалить), которые могут изменять значения. Как вы определите, является ли представление модифицируемым? В теории базы данных, это - пока обсуждаемая тема. Основной ее принцип такой: модифици-румое представление - это представление, в котором команда модификации может выполниться, чтобы изменить одну и только одну строку основной таблицы в каждый момент времени, не воздействуя на любые другие строки любой таблицы. Использование этого принципа на практике, однако, затруднено. Кроме того, некоторые представления, которые являются модифицируемыми в теории, на самом деле не являются модифицируемыми в SQL. Критерии по которым определяют, является ли представление модифицируемым или нет, в SQL, следующие: * Оно должно выводиться в одну и только в одну базовую таблицу. * Оно должно содержать первичный ключ этой таблицы (это технически не предписывается стандартом ANSI, но было бы неплохо придерживаться этого). * Ононедолжноиметьникакихполей, которые бы являлись агрегатными функциями. * Оно не должно содержать DISTINCT в своем определении. * Оно не должно использовать GROUP BY или HAVING в своем определении. * Оно не должно использовать подзапросы (это - ANSI ограничение, которое не предписано для некоторых реализаций) * Оно может быть использовано в другом представлении, но это представление должно также быть модифицируемыми. * Оно не должно использовать константы, строки, или выражения значений (например: comm * 100) среди выбранных полей вывода. * Для INSERT, оно должно содержать любые поля основной таблицы, которые имеют ограничение NOT NULL, если другое ограничение по умолчанию не определено. МОДИФИЦИРУЕМЫЕ ПРЕДСТАВЛЕНИЯ И ПРЕДСТАВЛЕНИЯ ТОЛЬКО ЧТЕНИЕ Одно из этих ограничений то, что модифицируемые представления, фактически, подобны окнам в базовых таблицах. Они показывают кое-что, но не обязательно все, из содержимого таблицы. Они могут ограничивать определенные строки (использованием предикатов), или специально именованные столбцы (с исключениями), но они представляют значения непосредственно и не выводит их информацию, с использованием составных функций и выражений. Они также не сравнивают строки таблиц друг с другом (как в обьединениях и подзапросах, или как с DISTINCT). Различия между модифицируемыми представлениями и представлениями толь-ко чтение неслучайны. Цели, для которых вы их используете, часто различны. Модифицируемые представления, в основном, используются точно так же как и базовые таблицы. Фактически, пользователи не могут даже осознать, является ли объект который они запрашивают, базовой таблицей или представлением. Это превосходный механизм защиты для сокрытия частей таблицы, которые являются конфиденциальными или не относятся к потребностям данного пользователя.(ВГлаве22, мы покажем вам, как позволить пользователям обращаться к представлению, анекбазовойтаблице). Представления только чтение, с другой стороны, позволяют вам получать и переформатировать данные более рационально. Они дают вам библиотеку сложных запросов, которые вы можете выполнить и повторить снова, сохраняя полученную вами информацию до последней минуты. Кроме того, результаты этих запросов в таблицах, которые могут затем использоваться в запросах самостоятельно (например, вобье-динениях) имеют преимущество над просто выполнением запросов. Представления только чтение могут также иметь прикладные программы защиты. Например, вы можете захотеть, чтобы некоторые пользователи видели агрегатные данные, такие как усредненное значение комиссионных продавца, не видя индивидуальных значений комиссионных. ЧТО ЯВЛЯЕТСЯ МОДИФИЦИРУЕМЫМ ПРЕДСТАВЛЕНИЕМ Имеются некоторые примеры модифицируемых представлений и представлений только чтение: CREATE VIEW Dateorders (odate, ocount) AS SELECT odate, COUNT (*) FROM Orders GROUP BY odate; Это - представление только чтение из-за присутствия в нем агрегатной функции и GROUP BY. CREATE VIEW Londoncust AS SELECT * FROM Customers WHERE city = London; Аэто- представление модифицируемое. CREATE VIEW SJsales (name, number, percentage) AS SELECT sname, snum, comm 100 FROM Salespeople WHERE city = SanJose; Это - представление только чтение из-за выражения comm * 100 . При этом, однако, возможны переупорядочение и переименование полей. Некоторые программы будут позволять удаление в этом представлении или в порядках столбцов snum и sname. CREATE VIEW Salesonthird AS SELECT * FROM Salespeople WHERE snum IN (SELECT snum FROM Orders WHERE odate = 10/03/1990); Это - представление только чтение в ANSI из-за присутствия в нем подзапроса. В некоторых программах, это может быть приемлемо. CREATE VIEW Someorders AS SELECT snum, onum, cnum FROM Orders WHERE odate IN (10/03/1990,10/05/1990); Это - модифицируемое представление. ПРОВЕРКА ЗНАЧЕНИЙ, ПОМЕЩАЕМ1Х В ПРЕДСТАВЛЕНИЕ Другой вывод о модифицируемости представления тот, что вы можете вводить значения которые проглатываются (swallowed) в базовой таблице. Рассмотрим такое представление: CREATE VIEW Highratings AS SELECT cnum, rating FROM Customers WHERE rating = 300;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |