|
Программирование >> Руководство по sql
интересы, потребности и уровни квалификации. Три наших пользователя видят данные по-разному, даже если они одновременно просматривают одни и те же три таблицы. Безопасность. Курсоры обеспечивают безопасность базы данных, скрывая секретные или не относящиеся к конкретной задаче части базы данных. В системе с правильно установленными полномочиями каждый пользователь имеет доступ только к информации, необходимой ему для выполнения своих профессиональных обязанностей. Подробно об использовании курсоров для обеспечения безопасности речь пойдет в главе 10. titles titlejd title type pub id price advance ytd sales notes pubdate titlenum titlejd pubJd price advance ytd sales pubdate titletext titlejd title type notes Рис. 9.1. Разбиение таблицы на две Независимость. Наконец, поговорим о независимости. Время от времени структура базы данных может изменяться. Но от этих изменений в первую очередь не должен страдать пользователь. Предположим, что таблица titles была преобразована в две таблицы и затем удалена. Новые таблицы представлены на рис. 9.1. Отметим, что таблица titles может быть восстановлена с помощью объединения новых таблиц по столбцу titlejd. Чтобы скрыть от пользователей изменения в структуре базы данных, можно создать курсор, объединяющий две новые таблицы (рис. 9.2). Можно даже назвать его titles (хотя у нас он называется titlesview). К сожалению, применительно к курсорам существует ряд ограничений на выполнение некоторых операторов модификации данных. Titlenum Titlejd PubJd Price Advance Ytd sales Pubdate create view titlesview as---- select tn.title id, pub id, price, advance, ytd sales, pubdate, title, .Type, notes from titlenum tn, titletext tt where tn.title id = tt.title id Titlesview Titlejd Title Type PubJd Price Advance Ytd sales Notes Pubdate Рис. 9.2. Использование двух базовых таблиц в одном курсоре КАК РАБОТАЮТ КУРСОРЫ Что на самом деле происходит в базе данных при создании и использовании курсора? Создание курсора означает его определение в терминах базовых таблиц. Определение курсора сохраняется в словаре данных без связанных с ним данных. Пользуясь курсорами, вы получаете доступ к связанным с ними таблицам. Другими словами, при создании и использовании курсора не создаются ни какие новые копии данных. Запрос к курсору выглядит абсолютно аналогично запросу к любой другой таблице базы данных. Однако на изменение данных в курсорах накладываются некоторые ограничения, которые будут рассмотрены далее в этой главе. А пока рассмотрим самый простой случай, когда курсор основан на одной таблице. Изменяя данные в таком курсоре, на самом деле вы изменяете данные в связанной с ним базовой таблице. И наоборот, все изменения в базовой таблице автоматически отражаются в созданном на ее основе курсоре. Предположим, что вы интересуетесь книгами, стоимость которых больше $15 и затраты на которые превысили $5000. Для этого можно просто использовать следующий оператор SELECT: SQL: select * from titles where price > $15 and advance > $5000 Предположим теперь, что вам надо выполнить по отношению к этой совокупности данных ряд операций выборки и обновления. Вы могли бы, конечно, скомбинировать условия, отображенные в предыдущем запросе, с любой задаваемой вами командой. Однако для удобства можно создать курсор, в котором будут видны только интересующие вас записи: SQL: create view hiprice as select * from titles where price > $15 and advance > $5000 Когда SQL получает эту команду, он на самом деле не выполняет оператор SELECT, который следует за ключевым словом AS. Вместо этого он запоминает этот оператор SELECT (который, в сущности, является определением курсора hiprice) в словаре данных. Теперь, когда вы отображаете или выполняете какие-то другие операции по отношению к hiprice, SQL комбинирует ваш оператор с запомненным определением hiprice. Процедура изменения всех цен в hiprice, например, ничем не отличалась бы от внесения изменений в любую другую таблицу. SQL: update hiprice set price = price*2 В действительности SQL находит определение курсора в словаре данных и преобразует эту команду обновления в следующий оператор: SQL: update titles set price = price*2 where price > $15 and advance > $5000 Другими словами, из определения курсора SQL знает, что подлежащие обновлению данные находятся в таблице titles. Он также знает, что цены следует увеличивать только в тех строках, которые соответствуют условиям для столбцов price и advance, заданным в определении курсора. Выполнив оператор обновления (обновление hiprice), вы можете увидеть соответствующий результат либо с помощью курсора, либо в таблице titles. И наоборот, если бы вы создали курсор, а затем выполнили оператор обновления (который воздействует непосредственно на базовую таблицу), изменивщиеся цены также можно было бы увидеть с помощью курсора. Если вы обновляете таблицу, на основе которой создан курсор, таким образом, что его условиям начинает удовлетворять большее число строк, их можно будет просматривать с помощью этого курсора. Допустим, например, что вы увеличиваете цену книги You Сап Combat Computer Stress до $25.95. Поскольку эта книга теперь удовлетворяет квалификационным условиям в операторе определения курсора, она становится частью этого курсора. Правила присвоения имен столбцам курсора Столбцам курсора можно присваивать псевдонимы. Если вы не задаете имена в операторе CREATE VIEW, столбцы курсора наследуют их от столбцов в таблице (таблицах), на основе которой построен данный курсор. Если вы действительно хотите задать новые имена, укажите их в скобках вслед за именем курсора, отделяя их друг от друга запятыми. (В некоторых системах можно также переименовать столбцы в списке выбора.) Бывают, однако, ситуации, когда новые имена для столбцов курсора являются обязательными. (Если вы переименовываете какой-либо столбец, то должны перечислить все столбцы.) Один или несколько столбцов курсора получаются с помощью некоторого арифметического преобразования, встроенной функции или константы. Курсору приходится иметь дело с несколькими столбцами под одним и тем же именем (так как разные столбцы в объединяемых таблицах могут иметь одно и то же имя). Первую ситуацию можно проиллюстрировать оператором CREATE VIEW для курсора с именем currentinfo, который мы обсуждали ранее в этой главе. SQL: create view currentinfo (PUBl, TYPE, INCOME, AVG PRICE, AVGJALES) as select pub id, type, sum(price*ytd sales), avg(price), avg(ytd sales) from titles group by pub id, type Вычисляемые столбцы в списке выбора на самом деле не имеют имен, поэтому вы должны присвоить их в операторе CREATE VIEW. В противном случае вы не сможете ссылаться на них. Когда вы работаете с курсором currentinfo, всегда пользуйтесь новыми именами, например: SQL: select PUBt, AVGJALES from currentinfo Использование старых имен, таких как pubid или avg(ytd sales), вам не поможет. Вторая ситуация, в которой присвоение столбцам новых имен является обязательным, обычно возникает, если объединяемые в операторе SELECT столбцы имеют одинаковые имена. Даже если в операторе SELECT для них указаны разные имена таблиц, для разрешения возникающей неоднозначности вам придется переименовать их:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |