|
Программирование >> Sql: полное руководство
ORDER BY AMOUNT DESC COMPANY AMOUNT REP NAME Zetacorp $45,000.00 Larry Fitch J.P. Sinclair $31,500.00 Sam Clark Chen Associates $31,350.00 Paul Cruz Acme Mfg. $27,500.00 Bill Adams Ian & Schmidt $22,500.00 Bob Smith Ace International $22,500.00 Tom Snyder Значительно легче сформировать запрос к такому представлению, чем создавать эквивалентное объединение трех таблиц Конечно, чтобы получить результаты однотабличного запроса к представлению, СУБД должна выполнить тот же объем работы, что и при генерации результатов эквивалентного трехтабличного запроса, и даже немного больше. Однако пользователю гораздо легче создавать однотабличные запросы. Обновление представлений Что значит вставить, удалить или обновить строку представления? Ясно, что для некоторых типов представлений эти операции можно преобразовать в эквивалентные операции по отношению к исходным таблицам представления. Например, вернемся к представлению eastreps, рассмотренному ранее в настояшей главе: Создать представление, показывающее информацию о служащих только восточного региона. CREATE VIEW EASTREPS AS SELECT * FROM SALESREPS WHERE REP OFFICE IN (11, 12, 13) Это простое горизонтальное представление, основанное на одной исходной таблице. Как видно из рис. 14.5, добавление строки в данное представление имеет смысл; оно означает, что новая строка должна быть вставлена в таблицу salesreps, лежащую в основе представления. Аналогично, имеет смысл удаление строки из представления eastreps - это удаление соответствующей строки из таблицы salesreps. Наконец, обновление строки представления eastreps также имеет смысл: оно будет обновлением соответствующей строки таблшщ salesreps. Во всех случаях требуемое действие можно вьшолнить по отношению к соответствующей строке исходной таблицы, тем самым сохраняя целостность исходной таблицы и представления. Теперь обратимся к сфуппированному представлению ord by rep, также рассмотренному ранее в настоящей главе: Создать представление, в которое входят суммарные данные о заказах по каждому служащему. CREATE VIEW ORD BY REP (WHO, HOW MANy, TOTAL, LOW, HIGH, AVERAGE) AS SELECT REP, COUNT(*), SUM(AM0UNT4 MIN(AMOUNT), MAX(AMOUNT), AVG(AMOUNT) FROM ORDERS GROUP BY REP Таблица SALESREPS EMPL NUM NAME Представление EASTREPS Bill Adams Mary Jones Sue Smith Sara Clark Bob Sraith Dan Roberts Tom Snyder Larry FItch Paul Cruz Nancy Angel I Рис 14.5. Обновление данных с использованием представления Между строками этого представления и строками исходной таблицы нет соответствия один-к-одному , поэтому добавление, удаление или обновление строк пред-стг1вления не имеет смысла. Представление ord by rep обновлять невозможно, его можно только читать. Представления eastreps и ord by rep являются двумя противоположностями в смысле сложности их определений. Имеются более сложные представления, чем east-reps, обновление которых возможно, и есть представления, менее сложные, чем ord by rep, обновление которых, однако, невозможно. Обновление представлений - непростой вопрос, который является предметом исследований уже не один год. Обновление представлений и стандарт ANSI/ISO в стандарте SQL1 четко указано, для каких представлений в базе данных должна существовать возможность обновления. Согласно стандарту, представление можно обновлять в том случае, если определяющий его запрос соответствует всем перечисленным ниже требованиям: Должен отсутствовать предикат distinct; т.е. повторяющиеся строки не должны исключаться из таблицы результатов запроса. В предложении from должна быть задана только одна таблица, которую можно обновлять; т.е. у представления должна быть одна исходная таблица, а пользователь должен иметь соответствующие права доступа к ней. Если исходная таблица сама является представлением, то оно также должно удовлетворять этим условиям. Каждое имя в списке возвращаемых столбцов должно быть ссылкой на простой столбец; в этом списке не должны содержаться выражения, вычисляемые столбцы или статистические функции. Предложение where не должно содержать подчиненный запрос; в нем могут присутствовать только простые условия отбора. В запросе не должны содержаться предложения group by и having. Перечисленные требования базируются на принципе, который запомнить, пожалуй, легче, чем сами требования: Представление разрешается обновлять в том случае, если СУБД может для каждой обновляемой строки представления найти исходную строку в исходной таблице, а для каждого обновляемого столбца представления - исходный столбец в исходной таблице . Если представление соответствует этим требованиям, то над ним и над исходной таблицей можно выполнять имеющие смысл операции вставки, удаления и обновления. Обновление представлений в коммерческих СУБД Правила, установленные в стандарте SQL1, являются очень жесткими. Существует множество представлений, которые теоретически можно обновлять, хотя они соответствуют не всем этим правилам. Кроме того, существуют представления, над которыми можно производить не все операции обновления, а также представления, в которых можно обновлять не все столбцы. В больщинстве коммерческих СУБД правила обновления представлений значительно менее строгие, чем в стандарте SQL1. Рассмотрим, в частности, такой пример: Создать представление, включающее плановый и фактический объемы продаж, а также разницу между ними для каждого служащего CREATE VIEW SALESPERF (EMPL NUM, SALES, QUOTA, DIFF) AS SELECT EMPL NUM, SALES, QUOTA, (SALES - QUOTA) FROM SALESREPS Стандарт SQLl запрещает обновление этого представления, поскольку четвертый столбец у него вычисляемый. Однако обратите внимание: каждая строка представления основана только на одной строке исходной таблицы (SALESREPS). По этой причине в DB2 (и ряде других коммерческих СУБД) разрещается вьшолнять инструкцию delete по отношению к этому представлению. Кроме того, в DB2 разрешаются операции обновления столбцов EMPL num, sales и quota, поскольку они берутся непосредственно из исходной таблицы. Не допускается только обновление столбца diff. В DB2 не разрешается выполнять инструкцию insert по отношению к этому представлению, так как добавление какого-либо значения в столбец diff не имеет смысла. Правила обновления представлений неодинаковы в различных СУБД, и обычно они довольно подробны. Некоторые представления, например созданные на основе сфуппированных запросов, не обновляются ни в одной СУБД, так как эта операция просто не имеет смысла. Некоторые типы представлений в одних СУБД обновлять можно, в других можно только частично, а в третьих вообще нельзя. Это нашло свое отражение в стандарте SQL2: в нем расширен круг обновляемых представлений и допускается значительное разнообразие правил обновлений для различных СУБД. Чтобы узнать правила обновления представлений в какой-нибудь конкретной СУБД, лучше всего обратиться к руководству пользователя или поэкспериментировать с различными типами представлений. Контроль над обновлением представлений (предложение WITH CHECK OPTION) Если представление создается посредством запроса с предложением where, то в представлении будут видны только строки, удовлетворяющие условию отбора. Остальные строки в исходной таблице присутствуют, но в представлении их нет Например, представление eastreps, которое уже рассматривалось ранее в настоящей главе, содержит только строки таблицы salesreps с определенными значениями в столбце rep office: Создать представление, показывающее информацию о служащих только восточного региона. CREATE VIEW EASTREPS AS SELECT *
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |