КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Предикаты, использующие выборку. Вложенные подзапросы.Предикаты – условия на запись, используемые в опции WHERE – как в запросах, так и командах модификации, в свою очередь, могут ссылаться на результаты запросов. Ниже следует перечисления таких предикатов.
1. r Знак_сравнения ALL (команда SELECT) (здесь и далее r – некоторое выражение скалярного типа над полями записи некоторой таблицы; comp – знак сравнения)
Предикат истинен, если сравнение выполняется для стоящего слева значения поля и всех значений [SELECT], выбранных командой SELECT; при этом предполагается, что последняя выдает некоторый список значений List - формально, таблицу с единственным полем, совместимым по типу со значением выражения, стоящим слева. Условие считается истинным также, если подвыборка пуста. r comp ALL (команда SELECT) = " vÎ List (r comp v)
2. r comp ANY | SOME (команда SELECT)
истинно, если сравнение выполняется для стоящего слева значения поля и хотя бы одного из значений, выбранных командой SELECT - снова предполагается, что последняя выдает некоторый список значений, совместимых по типу со значением поля. Если подвыборка пуста, условие считается ложным. r comp ANY | SOME (команда SELECT) = $ vÎ List (r comp v)
3. r [NOT] IN (команда_SELECT)
имеет тот же смысл, что и одноименный предикат IN, рассмотренный выше, с той лишь разницей, что список значений не задается явно, но является результатом подвыборки; истинен, если значение поля совпадает хотя бы с одним значением из (единственного поля) результата выборки.
R IN [SELECT] = r Î [SELECT]
3. [NOT] EXISTS (команда_SELECT)
истинно, если подвыборка (не) пуста, т.е. (не) содержит по крайней мере одну строку. EXISTS (SELECT) = Card([SELECT])>0 =$ r (rÎ [SELECT])
Пример. Выдать список имен богатых покупателей (с кредитом выше среднего)
Синтаксис SQL разрешает использовать во вложенном запросе ссылки на имена полей внешнего запроса. Такие вложенные запросы называют соотнесенными. Пример. Выдать список имен богатых в своем городе покупателей (с кредитом выше среднего по городу, в котором они живут)
В какой степени к результатам выборки можно относиться как к реальным таблицам? Многие версии предлагают опцию INTO приемник выборки Позволяя сохранить результаты выборки в реальном файле-таблице – постоянной или временной (курсоре), либо в оперативной памяти (массиве и пр.), а также переслать их а экран монитора, принтер и т.п.
Представления дают способ сослаться на результаты сравнения, не прибегая к его сохранению.
СОЗДАНИЕ ПРЕДСТАВЛЕНИЯ
CREATE VIEW Имя_представления AS команда SELECT
Замечание. В FoxPro допустимы 1) параметризованные представления, ссылающиеся на переменные FoxPro - при использовании параметров нужно поставить знак ? перед именем переменной. 2) модифицируемые представления; при этом cуть определения модифицируемости состоит в следующем - каждая базовая таблица, в которой будет происходить реальная физическая модификация данных, обязана иметь первичный ключ; - этот первичный ключ обязан содержаться в модифицируемом представлении. Более точное определение модифицируемости представлений можно найти в документации.
СОЗДАНИЕ КУРСОРА
Курсор – это временная таблица, с которой можно обращаться точно также, как с обычной таблицей БД, за одним, но важным исключением - в отличие от таблиц и представлений, курсор не считается частью БД; его содержимое и само определение действительно только в текущем сеансе работы и "теряется" немедленно по его закрытии.
CREATE CURSOR имя_курсора (список_описания_полей_курсора)
где описание поля курсора имеет вид (имя_поля тип_поля [(ширина_поля [, точностьe]) [NULL | NOT NULL] [CHECK Правило_корректности_поля [ERROR Текст_сообщения_о_нарушении_правила]] [DEFAULT значение_по_умолчанию] [UNIQUE]
См. описание опций в команде CREATE TABLE.
Поскольку курсоры не считаются неотъемлемой частью SQL, мы снова отошлем к документации любознательного читателя, интересующегося деталями обработки курсоров в FoxPro.
ТРАНЗАКЦИИ
Введенное ранее понятие целостности БД - важнейший случай более общего понятия безопасности данных, подразумевающего включение в рассмотрение не только логической схемы самой БД, но и некоторую схему всех аспектов ее использования - от физического размещения и сохранности данных до определения прав пользователей - относимым к вопросам ведения или администрирования БД. Не касаясь здесь сколь-нибудь подробно этих вопросов, отметим лишь как существенно бóльшую безопасность данных, так и бóльшую сложность задач администрирования при использовании технологии "клиент-сервер"[7]. Одним из наиболее важных программных средств обеспечения безопасности данных является механизм поддержки транзакций.
Транзакция- логически единая операция по модификации базовых таблиц, состоящая из одной или нескольких команд СУБД, переводящая БД из одного целостного, корректного, с точки зрения предметной области, состояния в другое, также логически корректное.
Это понятие полностью совпадало бы с понятием процедуры, если бы ни одно обстоятельство, которое в данном случае нельзя игнорировать – недетерминизм, действия по модификации БД могут не выполниться, по не зависящим от программиста и программы внешним воздействиям. Состояние s команды/программы не полностью определяет результат ее выполнения F(s).
F(s,X) X – скрытый фактор внешних воздействий, который может привести БД в некорректное состояние - F(s)¹F(s,X), для некоторых X.
В качестве такого скрытого фактора могут выступать самые разнообразные случайные факторы вроде сбоя электропитания, но даже при идеализации сетевой вычислительной среды нельзя игнорировать участия других пользователей, т.е. параллелизма действий различных модификаций.
Пример. Один пользователей удаляет запись, другой ее редактирует. Пользователь читает данные в момент выполнения другой команды.
Transaction(F,s,X)=if F(s)¹F(s,X) then F(s) [ else E ], " X
Поддержка транзакций гарантирует, что входящие в транзакцию команды либо выполнятся полностью, либо – если последнее невозможно по какой-либо причине (сбой энергоснабжения, конфликт действий пользователей в многопользовательской/ сетевой БД и пр.) – полное восстановление состояния БД на момент начала транзакции (или иной выбранной программистом контрольной точки соответствующей процедуры).
Утром деньги, вечером – стулья. Трансакция происходит от соотвествующего финансового термина – банковская сделка по переводу денег. Элементарная сделка такого рода состоит из операция снятия денег с одного счета и записи соответствующей суммы на другой. Понятно, что без выполнения той или иной операции трансакцию нельзя считать успешной. Более сложный пример такого рода колеективный обмен – например, квартир.
Определяющие свойства трансакции определяеют как ACID – Atomicity, Consistency, Isolation, and Durability - атомность, непротиворечивость, изолированность и стойкость. Под атомностью – «все или ничего», все вовлеченные в трансакцию изменения либо происходят целиком, либо не происходят вообще. Вместо – все или ничего, я бы сказал – не навреди. Непротиворечивость обеспечивает, что изменения приводят к корректному состоянию данных. Изоляция – трансакции могут вкладываться, но не могут пересекаться (промежуточные результаты одной трансакции доступны другой, лишь если та полностью вложена в первую, т.е. составляет ее часть) Стойкость означает, что подтвержденные результаты трансакции должны выдерживать все внешние воздействия (скажем, падение сервера)
Простые примеры трансакции – сами команды SQL. Это – автоматические, не объявленные явно трансакции.
Примером транзакции может служить триггер каскадного удаления записи родительской таблицы, с последующим удалением записей дочерних таблиц. Все удаления должны быть либо осуществлены полностью, либо не осуществлены вообще – в противном случае в БД могут появиться записи-сироты.
Подобно традиционному понятию процедуры, транзакция – логическая операция, реализуемая с помощью команд языка. Отличие - в явном допущении возможности лишь частичного выполнения. Основной принцип транзакции - "все или ничего". Сбой при выполнении любой команды ведет к откату – невыполнению всей транзакции.
Понятие трансакции отражает существо, и скрывает сложную реализацию двух основных механизмов поддержки многопользовательских БД – буферизации и блокировки.
Внутри транзакции модификация содержимого таблиц БД производиться над их копиями в буфере, затем производиться блокировка – запрет на действия по модификации оригиналов таблиц другими пользователями. Если блокировка удачна, т.е. соответствующие таблицы не заблокированы другим пользователем, содержимое буфера (результат трансакции) записывается в собственно таблицы БД, если нет – оригиналы остаются неизменными.
Начало транзакции оформляется командой SQL
BEGIN TRANSACTION
закачивается либо командой корректного завершения транзакции
END /COMMIT [TRANSACTION]
либо командой "отката", т.е. возврата к состоянию БД к моменту начала транзакции
ROLLBACK
FoxPro поддерживает до 5 уровней вложенности транзакций. Однако, поскольку другие пользователи сети не имеют доступа к записи таблиц БД, модифицируемым во время исполнения транзакции, необходимо минимизировать время ее выполнения.
|