Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 21. Изменение значений с помощью представлений

ны, и это справедливо для любой строки, вставляемой в Londonstaff. Строки вводятся через представление Londonstaff в таблицу Salespeople, а затем исключаются из само­ го представления (если только точно заданное значение по умолчанию не является 'London', но это - особый случай). Пользователь будет не в состоянии вводить строки в данное представление, и все же, даже не зная об этом, сможет вводить строки непо­ средственно в таблицу, лежащую в основе настоящего представления. Даже если до­ бавить WIТH СНЕСК OPТION в определение представления:

CREATE VIEW Londonstaff

AS SELECT snum, sname, comm FROM Salespeople

WHERE city = ·London· WITH СНЕСК OPTION;

проблема не решится. Вывод может быть таким: надо иметь возможность обновлять значения в представлении, удалять строки, но не вставлять (добавлять) их. Иногда не надо разрешать пользователю выполнять добавление строк в представление. Часто

полезно включать в представления все поля, на которые есть ссылка в предикате,

даже если они не всегда предоставляют полезную информацию. Если присутствие

этих полей в выходных данных нежелательно, можно всегда исключить их из запроса

на формирование представления и использовать для запроса внугри представления. Т. е. можно определить представление Londonstaff таким образом:

CREATE VIEW Londonstaff AS SELECT •

FROM Salespeople WHERE city = 'London' WITH СНЕСК OPTION;

В результате выполнения команды получается представление с одинаковыми зна­

чениями поля city, которые можно исключить из состава выходных данных с помо­

щью запроса:

SELECT snum, sname, comm

FROM Londonstaff:

Работа с представлениями, базирующимися на других

представлениях

Следует вспомнить о WITH СНЕСК OPTION в ANSI. В нем не поддерживается каскадный принцип; это предложение действует только на то представление, в кото­ ром оно определено, но действие его не распространяется на представления, базирую­ щиеся на этом представлении. Например, в предыдущем примере:

CREATE VIEW Highratings

AS SELECT cnum, rating

230

Выбор з11аче11ий, размеще1111ых в llредставлениях

FROM Customers

WHERE rating = 300

WITH СНЕСК OPTION;

попытки вставить или обновить значения рейтинга, отличные от 300, будут ошибочными. Но можно создать второе представление (с тем же самым содержимым), основанное на первом представлении:

CREATE VIEW Myratings

AS SELECT •

FROM Highratings;

Для такого представления можно выполнить изменение рейтинга на значение, от­ личное от 300:

UPDATE Myratings

SЕТ rating = 200

WHERE cnum 2004;

Команда будет воспринята и выполнена.

Предложение WIТH СНЕСК OPТION позволяет убедиться в том, что любое об­

новление значений в представлении осуществляется в соответствии со значениями,

указанными в предикате для этого представления. Обновление других представлений, базирующихся на данном, вполне возможно, хотя ему могут препятствовать предло­ жения WIТH СНЕСК OPТION внутри этих представлений. Даже если такие представ­

ления присутствуют, они контролируют только предикаты представлений, в которых

содержатся. Таким образом, даже если представление Myratings бьшо бы определено следующим образом:

CREATE VIEW Myratings

AS SELECT •

FROM Highratings

WПН СНЕСК OPТION;

проблема не была бы решена. Предложение WIТH СНЕС OPTION проверяет только предикат представления Myratings. Поскольку Myratings фактически не имеет предиката, то предложение WIТH СНЕСК OPTION практически ничего не делает. Если бы в команде применялся предикат, то именно он бы и использовался для

любых обновлений Myratings, а предикат, заданный в определении Highratings

игнорировался бы.

Это недостаток стандарта SQL, который во многих программных продуктах кор­

ректируется. Прежде чем использовать на практике определение представления, рас­

смотренного в последнем примере, следует опробовать его свойства на примере. (Эта попытка может оказаться более успешной и результативной, чем попытка найти ответ на конкретный вопрос в системной документации.)

231

Глава 21. Измепепие з11аче11ий с помощью представлений

Итоги

Представления изучены полностью. Помимо правил определения, является ли дан­ ное представление обновляемым в SQL, вы узнали базовые концепции, на которых ос­ новываются правила: обновления представлений разрешены, только если SQL может однозначно определить, какие значения лежащих в основе представления таблиц сле­ дует обновить. Это означает, что команда обновления в процессе выполнения не тре­ бует ни изменения множества строк в единицу времени, ни сравнений множества строк какой-либо базовой таблицы либо выходных данных запроса. Поскольку соеди­ нения требуют сравнения строк, они запрещены. Вы научились отличать способы при­ менения обновляемых представлений и представлений "только для чтения".

Обновляемые представления можно рассматривать как окна, показывающие дан· ные единственной таблицы, в которой могут быть опущены или переставлены места­ ми столбцы, а также представлены только те строки, которые удовлетворяют

предикату.

С другой стороны, представления "только для чтения" могут содержать наиболее эффективные SQL-запросы, следовательно, они сами могут быть способом получения запросов, которые необходимо выполнить практически в неизменном виде. Кроме того, имея запросы, где выходные данные рассматриваются как объекты, к которым в свою очередь формулируются запросы для получения выходных данных, можно по­

следовательно уточнять и получать интересующие данные.

Теперь вы умеете с помощью предложения WIТH СНЕСК OPТION в определении представления предотвращать выполнение команд обновления данных представле­ ний, ориентированное на введение в базовую таблицу тех строк, которых нет в самом представлении, а также использовать WIТH СНЕСК OPТION вместо ограничений на таблицу, лежащую в основе данного представления.

Для отдельных запросов обычно можно без особых проблем использовать в преди­ кате один или более столбцов, которые не представлены в списке выбранных выход­ ных данных. Однако, если такие запросы применяются в обновляемых представлениях, то они являются проблематичными, поскольку порождают представ­ ления, которые не могут иметь вставляемых строк (хотя при отсутствии WITH СНЕСК OPТION строки могут содержаться в базовой таблице). Мы рассмотрели ряд возможных подходов к решению этой проблемы.

В последних двух главах мы затронули средства защиты представлений. Можно открыть пользователям доступ к представлениям, не открывая доступа к таблицам, ко­ торые являются непосредственной основой представлений. В главе 22 рассматривает­ ся вопрос доступа к данным как объектам SQL.

232

Работаем на SQL

1.Какие из представлений являются обновляемыми?

#1

CREATE VIEW

Dailyorders

 

AS

SELECT

DISTINCT cnum, snum, onum, odate

 

 

FROM

Orders;

 

#2

CREATE VIEW Custotals

 

AS

SELECT

cname,

SUM (amt)

 

 

FROM

Orders,

Customers

 

 

WHERE Orders.cnum = customers.cnum

 

 

GROUP

ВУ cname;

#З CREATE VIEW Thirdorders

 

AS

SELECT

*

 

 

 

FROM

Dailyorders

 

 

WHERE

odate

= 10/03/1990;

#4

CREATE VIEW

Nullcities

 

AS SELECT snum, sname, city

 

 

FROM

Salespeople

 

 

WHERE

city IS NULL

 

 

OR sname BEТWEEN ·д· AND ·мz·;

2.Создайте представление таблицы Salespeople с именем Comшissions. Это пред­ ставление будет включать только поля snum и comm. Для этого представления можно вводить и изменять комиссионные, но это могут быть только значения из интервала .10 и .20.

3.Некоторые SQL приложения имеют встроенные ограничения, представляющие текущую дату, иногда называемую "CURDATE". Значит слово CURDATE мо­ жет использоваться в SQL-предложениях и заменяется текущей датой тогда, ко­ гда это ключевое слово применяется в командах SELECT и INSERT. Будет использоваться представление таблицы Orders, имеющее имя Entryorders и даю­ щее возможность вставлять строки втаблицу Orders. Создайте таблицу Orders та­ ким образом, чтобы CURDAТЕ автоматически подставлялось в поле odate, если никакое значение не задано. Затем создайте представление Entryorders так, что­ бы никакие значения не могли быть изменены.

(Ответы смотри в приложении А.)

233

22

lПWПWrlQШi]~

Определение прав доступа к данным

Источник: https://studfile.net/preview/16418473/