Главная | Обратная связь
МегаЛекции

Управление транзакциями




Транзакция– это действие или серия действий, выполняемых пользователем или прикладной программой, которые осуществляют доступ к БД или изменяют содержимое БД. Это логическая единица работы, выполняемая над БД. Она переводит БД из одного согласованного состояния в другое. В случае успешного завершения результаты транзакции фиксируются в БД (COMMIT) или отменяются (ROLLBACK). Следует отметить, что СУБД не обладает возможностью определять, какие изменения должны быть восприняты как единое целое. Если это необходимо, то транзакция оформляется с помощью соответствующих команд SQL.

Для фиксации хода выполнения транзакций в базе данных СУБД использует специальный журнал, который называют логическим журналом. Он содержит сведения о всех обновлениях, выполненных в базе данных. Записи о транзакциях в журнале содержат:

- идентификатор транзакции;

- тип записи журнала (начало транзакции, операции вставки, обновления, удаления, отмена или фиксация транзакции);

- идентификатор элемента данных, вовлеченного в операцию обработки;

- копию элемента до операции; копию после операции;

- служебную информацию (указатели на предыдущую и следующую запись);

- записи контрольных точек.

Помещаемая в файл журнала информация предназначена для использования в процессе восстановления системы после отказа. Одно из основных затруднений в этой схеме состоит в том, что, когда происходит отказ, может отсутствовать какая-либо информация о том, насколько далеко назад следует “откатиться” в файле журнала, чтобы начать повторный прогон уже завершенных транзакций. В результате может оказаться, что повторный прогон будет выполнен для тех транзакций, которые уже были окончательно зафиксированы в базе данных. Для ограничения объема поиска и последовательной обработки информации в файле журнала используется технология контрольных точек.

Контрольная точка – момент синхронизации между базой данных и журналом регистрации транзакций. В этот момент все буфера принудительно записываются во вторичную память системы. Контрольные точки организуются через установленный интервал времени и включают выполнение следующих действий: запись всех имеющихся в оперативной памяти записей журнала во вторичную память; запись всех модифицированных блоков в буферах базы данных во вторичную память; помещение в файл журнала записи контрольной точки.

В журнале запись контрольной точки содержит идентификаторы всех транзакций, которые были активны в момент создания этой контрольной точки. После возникновения отказа файл журнала просматривается в целях обнаружения последней из транзакций, начавших свою работу до момента создания последней контрольной точки. Любая более ранняя транзакция будет зафиксирована в базе данных, это значит, что ее изменения были перенесены на диск в момент создания последней контрольной точки.



Управление параллельностью – это процесс организации одновременного выполнения в БД различных операций, гарантирующих исключение их взаимного влияния друг на друга. Блокировка – это процедура, используемая для управления параллельным доступом к данным. Когда некоторая транзакция получает доступ к данным, механизм блокировки позволяет отклонить попытки получения доступа к этим же данным со стороны других транзакций.

Обработка запросов

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

Рис.
2.2. Схема выполнения запроса

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

Для примера рассмотрим варианты выполнения запроса на выборку сведений по деталям, сделанным из стали, весом более 10 единиц.

SELECT *

FROM DETEIL d, MATERIAL m

WHERE (d.MATERIAL_CODE = m.MATERIAL_CODE) AND (d.DETAIL_WEIGHT>10 AND m.MATERIAL_NAME = ' Сталь')

Имеют место три варианта выполнения запроса.

1. Чтение исходных отношений, декартово произведение таблиц, вывод на диск результирующего отношения, считывание его и выборка результата:

(4+4) +2×(4×4)=40 (операций).

Соединение отношений по полю MATERIAL_CODE, запись результирующего отношения и его считывание для выборки результата:

2×4 + (4+4)=16 (операций).

Обработка раздельно таблиц в соответствии с заданными условиями (первая таблица содержит две записи, вторая – одну), соединение укороченных таблиц (при этом выполняется сначала запись, а потом считывание):

4+4+2+1 + 2+1=14 (операций).

2.1.3. Потребительские качества СУБД

Сервер БД ориентирован на удовлетворение информационных потребностей большого количества пользователей и работает в многозадачном, многопользовательском режиме. В основе ядра системы лежит параллельная архитектура. Можно выделить четыре составляющих, которые характеризуют архитектуру сервера БД: масштабируемость, производительность, возможность смешанной загрузки разными типами задач, обеспечение постоянной доступности к данным.

Масштабируемость – это свойство вычислительной системы, которое обеспечивает предсказуемый рост системных характеристик (числа пользователей, быстроты реакции и т.п.) при добавлении к ней вычислительных ресурсов. Любой сервер имеет конфигурационный файл, в котором задаются основные настройки его функционирования. Это обеспечивает способность на ходу определять такие параметры, как объем потребляемой памяти, число занятых процессоров, количество параллельных потоков выполнения заданий, и ряд других, без останова и перезапуска системы.

Производительность достигается поддержкой параллелизма и реализацией многопотоковой архитектуры. Любой запрос делится на атомарные операции (сканирование, сортировка, выборка и т.п.), которые выполняются параллельно и каждая из которых начинает выполняться сразу с появлением данных, не ожидая завершения предыдущего шага. Для увеличения производительности создан буферный пул, в который считываются страницы, используемые параллельно пользователями.

Способ организации одновременной обработки множества запросов внутри сервера БД при минимальных накладных расходах на переключение контекста и максимальном разделении вычислительных ресурсов между ними называется многопотоковойархитектурой. Поток (thread) – это фрагмент контекста одного процесса, включающий только те данные, которые необходимы для реализации выполняемых потоком функций. Например, при обработке операции соединения таблиц может одновременно начинать работать операция последовательного чтения и фильтрации строк с диска, а ее результаты по мере поступления могут быть переданы на вход операции сортировки, и при этом все три операции (сканирование, объединение, сортировка) выполняются параллельно и представлены в сервере в виде потоков.

Возможность смешанной загрузки разными типами задач.

Автоматизированные информационные системы объединяют три вида задач.

1. Оперативная обработка транзакций (On-Line Transaction Processing - OLTP).

2. Поддержка принятия решений (Decision Support System).

3. Пакетная обработка.

 

Работу сервера обработки транзакций (OLTP) можно охарактеризовать следующим:

- наиболее часто используются короткие транзакции;

- транзакции обычно не используют одни и те же данные;

- операторы запроса затрагивают обычно только несколько строк таблицы;

- используется несколько таблиц большого размера, которые могут быть значительно изменены.

Реализация сервера обработки транзакций опирается на физические методики сокращения операций с дисками, обработку небольших объемов данных в памяти, примитивный оптимизатор запросов, а также требования к приложениям – исключить конкуренцию запросов в использовании ресурсов и данных.

Работу сервера системы поддержки принятия решений (DSS) можно охарактеризовать следующим:

- объем таблиц в целом не ограничен;

- часто требуется просмотр всех строк таблицы;

- число таблиц, участвующих в транзакции, может быть велико;

- обычно транзакции не модифицируют данные;

- высока вероятность разделения ресурсов и данных разными задачами.

Реализация сервера системы поддержки принятия решений опирается на мощный оптимизатор запросов, эффективные методики сканирования и соединения таблиц, механизмы обеспечения параллельного доступа к данным нескольких приложений.

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

- обрабатываются большие и сверхбольшие размеры таблиц;

- преобладает значительная продолжительность транзакций;

- часто необходим просмотр и/или модификация всех строк таблицы;

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

Для одновременной эффективной работы всех трех видов приложений используются оптимизация запросов, эффективное управление ресурсами, параллельная обработка запросов. К управлению ресурсами, в частности, относятся алгоритмы управления памятью. При этом приложения СУБД используют разделяемую память для сохранения контекста подключения, а также кэширование запросов и результатов.

Постоянная доступность данных обеспечивается оперативным администрированием и средствами сохранности информации (зеркалирование и тиражирование). Зеркалирование базы данных либо отдельных ее таблиц осуществляется на другом физическом устройстве. В случае какого-либо аппаратного сбоя выполняется незаметный для пользователя переход на зеркалируемый диск. Тиражирование БД поддерживается, как правило, удаленно. Это по сути дела копирование всей базы для дистанционного доступа к информации. Данный способ удобен, когда на одном компьютере выполняется первичная обработка информации (OLTP), а на другом – анализ данных (DSS). Все изменения, происходящие в первичной базе, реплицируются (тиражируются) на машину, где осуществляется анализ информации.

2.2. Унифицированный язык для работы с БД SQL

Язык SQL (Structured Query Language) впервые появился в некоммерческом продукте SYSTEM R (IBM) в 70-е годы. Благодаря большой популярности и тщательности проработки SQL приобрел статус стандарта реляционного языка манипулирования данными. В 1982 году фирма IBM стала поставлять коммерческий продукт DB2, в котором был объединен значительный арсенал достижений в области технологии реляционных БД. Известно три версии стандарта языка SQL: SQL1 (89), SQL2 (92), SQL3 (99).

SQL включает в себя совокупность конструкций для определения структуры базы данных, операций актуализации, выборки, санкционирования доступа, описания пользовательских представлений, управления транзакциями, описания триггеров и т.д. Рассмотрим основные конструкции языка SQL.

2.2.1. Определение схемы базы

CREATE TABLE <имя таблицы> ({<имя поля> <тип> (<размер>) [NOT NULL] [UNIQUE] [DEFAULT <опция>] [CHECK <условие>]}* [<определение ограничения таблицы>]);

<тип>::= CHAR(n)/VARCHAR(n)/NUMERIC(n,m)/DECIMAL(n,m)/REAL;

<определение ограничения таблицы>::=
PRIMARY KEY (<список полей>) / [UNIQUE (<список полей>)],

[{[CONSTRAINT <имя ограничения>]

FOREIGN KEY (<список полей>) REFERENCES <имя таблицы> [(<список полей>)] [ON DELETE <опция>], [ON UPDATE <опция>]}*],

[{CHECK (<условное выражение>)}*];

<опция>::= RESTRICTED/ CASCADE/ SET DEFAULT / SET NULL;

Существует три вида определения ограничений: определение первичного ключа, определение вторичного ключа, определение проверочного условия.

- Определение первичного ключа:

PRIMARY KEY (<список полей>);

UNIQUE (<список полей>) -альтернативные ключи;

- Определение вторичного ключа:

FOREIGN KEY (<список полей>)

REFERENCES <имя таблицы> [(<список полей>)]

[ON DELETE <опция>] [ON UPDATE <опция>];

<опция> = RESTRICTED – контроль ограничений;

CASCADE – каскадное удаление (обновление);

SET DEFAULT – присвоение значений по умолчанию;

SET NULL – присвоение нулевых значений FK при удалении первичного.

- Проверочное условие:

CHECK (<условное выражение>);

Пример:

CREATE TABLE DETAILl(

DETAILl_CODE char(3),

DETAIL_NAME char(10),

DETAIL_WEIGHT integer,

MATERIAL_CODE char(3),

FOREIGN KEY (MATERIAL_CODE) REFERENCES
MATERIAL (MATERIAL_CODE)

ON DELETE RESTRICTED

ON UPDATE RESTRICTED,

PRIMARY KEY (DETAIL_CODE),

CHECK (DETAIL_WEIGHT>0 AND DETAIL_WEIGHT<50));

2.2.2. вставка записи в таблицу

INSERT INTO <имя таблицы>[ (<список полей>)] VALUES (<список значений>);

Пример: INSERT INTO MATERIAL (MATERIAL_CODE, MATERIAL_NAME) VALUES (‘M2’, ‘Сталь’);

2.2.3. Обновление записей

UPDATE <имя таблицы> SET <список вида <имя поля>=<выражение>> [WHERE <условие>];

Пример: UPDATE SUPPLIER SET SUPPLIER_CITY = 'Ковров' WHERE SUPPLIER_CODE = 'S4';

2.2.4. Удаление записей

DELETE FROM <имя таблицы> [WHERE <условие>];

Пример: DELETE FROM ORDER WHERE SUPPLIER_CODE = S2';

2.2.5. Удаление таблицы

DROP TABLE <имя таблицы>;

2.2.6. Реструктуризация таблицы

ALTER TABLE <имя таблицы> [ADD <определение столбца>] / [ALTER <имя столбца>] / [DROP <имя столбца>] / [ADD <ограничение>] / [DROP CONSTRAINT <имя ограничения>];

2.2.7. Выборка информации из таблиц

SELECT [ALL | DISTINCT]

[* / {<колонка> [AS <новое имя>]}* ]

FROM {<имя таблицы>}*

[WHERE <условие>]

[GROUP BY <список полей >]

[HAVING <условие>]

[ORDER BY <список полей> [DESC]];

Опция SELECT определяет записи, которые следует выбрать из таблицы. Опция FROM определяет список таблиц, из которых делается выборка. Опция WHERE задает условие выборки. Опция GROUP BY обеспечивает группировку записей по совпадающим значениям заданного поля. Опция HAVING используется в сочетании с GROUP BY для того, чтобы выбрать группы по заданному условию. Опция ORDER BY задает упорядочивание информации в результирующей выборке.

В опции SELECT возможно использование агрегативных функций (MAX, MIN, COUNT, AVG, SUM). При этом необходимо сделать группировку (GROUP BY) по тому полю, в рамках которого действует агрегативная функция. Рассмотрим примеры характерных запросов к тестовой базе данных.

    Результат:
1) Получить имена деталей весом более 10 SELECT DETAIL.DETAIL_NAME FROM DETAIL WHERE (DETAIL.DETAIL_WEIGHT>10); Болт Муфта
2) Выбрать максимальную поставку детали D2. SELECT Max(ORDER.ORDER_QUANTITY) FROM ORDER GROUP BY ORDER.DETAIL_CODE HAVING (ORDER.DETAIL_CODE="D2");  
3) Получить число поставок каждой детали. SELECT ORDER.DETAIL_CODE, Count(ORDER.ORDER_ID) FROM ORDER GROUP BY ORDER.DETAIL_CODE; D1 4 D2 4 D3 1 D4 1
4) Получить количество поставки каждой детали. SELECT ORDER.DETAIL_CODE, Sum(ORDER.ORDER_QUANTITY) FROM ORDER GROUP BY ORDER.DETAIL_CODE; D1 800 D2 1100 D3 400 D4 200  
5) Получить имена поставщиков, поставляющих деталь D2. SELECT DISTINCT s.SUPPLIER_NAME FROM SUPPLIER s, ORDER o s INNER JOIN o ON s.SUPPLIER_CODE= o.SUPPLIER_CODE WHERE o.DETAIL_CODE=‘D2’; Или SELECT DISTINCT s.SUPPLIER_NAME FROM SUPPLIRE s, ORDER o WHERE s.SUPPLIER_CODE= o.SUPPLIER_CODE AND o.DETAIL_CODE=‘D2’; Или SELECT DISTINCT s.SUPPLIER_NAME FROM SUPPLIER s WHERE s.SUPPLIER_CODE IN (SELECT o.SUPPLIER_CODE FROM ORDER o WHERE o.DETAIL_CODE=‘D2’); {IN – выборка из множества} Иванов Петров Сидоров
SQL позволяет рекурсивно задавать запрос в запросе. При этом сначала выполняется внутренний запрос, а затем его результат подставляется во внешний.
6) Получить имена деталей, имеющих более одной поставки. SELECT DETAIL.DETAIL_NAME, Count(ORDER.SUPPLIER_CODE) AS Count_SUPPLIER_CODE FROM DETAIL INNER JOIN ORDER ON DETAIL.DETAIL_CODE = ORDER.DETAIL_CODE GROUP BY ORDER.DETAIL_CODE; SELECT Запрос6.DETAIL.DETAIL_NAIM FROM Запрос6 WHERE Запрос6.Count_SUPPLIER_CODE>1     Болт Винт  

2.2.8. Объявление вида над таблицей

CREATE VIEW <имя вида> [<список полей>]

AS <SQL-предложение>

[WITH [CASCADED | LOCAL] CHECK OPTION];

Пример:

CREATE VIEW BIG_DETAIL

AS SELECT d.DETAIL_CODE, d.DETAIL_NAME, d.DETAIL_WEIGHT, d.MATERIAL_CODE

FROM DETAIL d

WHERE d.DETAIL_WEIGHT>10;

Вся работа с видом приравнивается к работе с обыкновенной таблицей:

SELECT d.DETAIL_NAME, d.DETAIL_WEIGHT

FROM BIG_DETAIL d

WHERE d.DETAIL_NAME=”Болт”;

2.2.9. Объявление прав доступа

Снятие привилегий выполняется командой REVOKE, а открытие прав доступа – командой GRANT:

REVOKE <список привилегий> ON <имя таблицы>/ <имя вида> FROM [PUBLIC] / [<имя пользователя>];

<привилегия>::= SELECT/ INSERT/ ALL/…..;

GRANT <список привилегий> ON <имя таблицы> TO [PUBLIC] / [<имя пользователя>];

Пример:

REVOKE ALL ON ORDER FROM PUBLIC;

GRANT SELECT ON ORDER TO 'idr';

GRANT DELETE ON DETAIL TO 'levi';

2.2.10. Создание индекса

CREATE [UNIQUE] INDEX <имя индекса>

ON <имя таблицы> ({<имя поля> [ASC/DESC]}*);

Сервер автоматически создает индексы по первичным и вторичным ключам, а также по тем полям, которые помечены опцией UNIQUE при создании таблицы. Опция UNIQUE указывает на то, что индексируемый столбец должен содержать уникальные значения в каждой строке таблицы.

Пример:

CREATE INDEX idx1 ON SUPPLIER (SUPPLIER_NAME);

2.2.11. Объявление транзакций

Транзакция – это последовательность операций с БД (UPDATE, INSERT, DELETE), которые преобразуют некоторое непротиворечивое состояние базы в другое непротиворечивое состояние, не гарантируя сохранение непротиворечивости во все промежуточные моменты времени.

SQL позволяет объявить транзакцию и в случае ее успешного завершения обновить состояние базы, а в случае неуспешного завершения – произвести откат базы к исходному состоянию.

Пример:

BEGIN TRANSACTION;

LOCK TABLE ORDER;

DELETE FROM ORDER WHERE SUPPLIER_CODE='S2';

INSERT INTO ORDER (DETAIL_CODE, SUPPLIER_CODE, ORDER_QUANTITY, ORDER_DATE)

VALUES ('D1', 'S22', 600,'01.07.04');

IF <ошибка> THEN GO TO M1;

COMMIT TRANSACTION;

GO TO M2;

M1: ROLLBACK TRANSACTION;

M2: RETURN;

2.2.12. Хранимые процедуры

Каждый сервер БД поддерживает свой диалект языка присоединенных процедур. Преимуществами использования для программирования бизнес-логики приложений языка присоединенных процедур являются производительность, сокращение сетевого трафика (по сети передается только запрос), защита, инкапсуляция (метод, посредством которого пользователи или программы манипулируют объектами СУБД). Язык хранимых процедур (Stored Procedure Language – SPL) предусматривает следующие конструкции:

- условный оператор IF THEN ELSE;

- оператор цикла WHILE / FOR;

- блоки инструкций BEGIN … END;

- именованные переменные;

- именованные процедуры.

Описание процедуры начинается с команды:

CREATE PROCEDURE <имя процедуры> (<список параметров>);

Выполнение процедуры активизируется командой:

EXECUTE <имя процедуры> (<список параметров>);

Пример процедуры, которая вызывает информацию по заданному коду поставщика:

CREATE PROCEDURE get_supp (c_code in char(3), c_name out char(10), c_city out char(50));

as

BEGIN

select SUPPLIER_NAME, SUPPLIER_CITY

into c_name, c_city

from SUPPLIER

where SUPPLIER_CODE = c_code;

commit;

END;

Вызов описанной процедуры get_supp может быть организован следующим образом:

declare the_name char(10), the_city char(50);

EXECUTE get_supp ('S2', the_name, the_city);

Различные серверы баз данных поддерживают свои диалекты языков присоединенных процедур (например, Oracle – PL/SQL, Informix – SPL). Вместе с тем разработан международный стандарт языка процедур SQL/PSM (Persistent Stored Modules).

2.2.13. Триггеры

Триггеры – это особые хранимые процедуры, которые вызываются в ответ на актуализацию содержимого БД. Каждый триггер связывается с определенной таблицей базы, и СУБД выполняет его, когда данные в соответствующей таблице изменяются (реакция на команды INSERT, DELETE, UPDATE). Например, триггеры могут использоваться для автоматического обновления информации в БД. При описании триггера используется следующий синтаксис:

CREATE TRIGGER <имя триггера>

BEFORE /AFTER <триггерное событие> ON <имя таблицы>

[REFERENCING <список старых и новых псевдонимов>]

[FOR EACH {ROW / STATEMENT}] [WHEN (<условие триггера>)]

<тело триггера>;

Пример:

Перед очисткой таблицы ORDER переписать в архив (таблица ARX) удаляемые записи:

CREATE TRIGGER T4

BEFORE DELETE ON ORDER

BEGIN

INSERT INTO ARX(DETAIL_CODE, ORDER_QUANTITY);

SELECT o.DETAIL_CODE, SUM(o.ORDER_QUANTITY)

FROM ORDER o

GROUP BY o.DETAIL_CODE);

END;

2.2.14. Встроенный SQL

SQL-конструкции встраиваются непосредственно в исходный текст программы на языке высокого уровня. Базовая разновидность встроенного SQL называется статическим SQL. Усовершенствованный вариант, позволяющий формирование конструкций SQL прямо в программе, называется динамическим SQL. Каждый сервер БД поддерживает интерфейс с определенными языками высокого уровня, в которых можно использовать команду “EXEC SQL”. При этом в пользовательской программе интерактивно запрашиваются значения переменных, которые передаются в SQL-команды, а затем просматриваются результаты запроса. Специальные программы – предкомпиляторы преобразуют исходный текст программы в целях замены SQL-операторов соответствующими вызовами функций СУБД. Т.к. выборка из БД представляет собой отношение, то во встроенном SQL предусмотрена работа с курсором. Курсор – это вид указателя, который может быть использован для перемещения по набору строк отношения, являющегося результатом выборки из БД. При этом используются команды объявления курсора DECLARE и команда чтения текущей строки курсора FETCH:

DECLARE < имя курсора> CURSOR

FOR <табличное выражение>

[ORDER BY <список полей>];

FETCH [NEXT/LAST/FIRST/CURRENT/PREVIOUS] <имя курсора> INTO <список имен переменных основной программы>;

Фрагмент программы на языке высокого уровня:

<объявление переменных>

EXEC SQL CONNECT <имя базы>;

EXEC SQL DECLARE x CURSOR FOR

SELECT s.SUPPLIER_CODE, s.SUPPLIER_NAME, SUPPLIER_CITY

FROM SUPPLIER s

WHERE SUPPLIER.CITY=:Y;

EXEC SQL OPEN x;

BEGIN

<перебор строк выборки>

EXEC SQL FETCH NEXT x INTO :S#, :Sname, :Scity;

<обработка данных>

END;

EXEC SQL CLOSE x;

В программе имеются ссылки на переменные, которые должны быть описаны в секции объявления переменных. Для отличия переменных от имен полей программы они сопровождаются двоеточием “:” ( например, переменная :Y описывается в начале программы и содержит наименование города, заданного пользователем, по которому делается выборка из таблицы поставщиков).

СУБД поддерживают динамический SQL для интерактивных приложений, в которых SQL-запрос генерируется “на лету”. При этом выполняется определенная последовательность действий:

1) принять команду терминала;

2) проанализировать команду;

3) сгенерировать соответствующий SQL-оператор;

4) сгенерировать сообщение или результат на терминал.

В одной из своих переменных программа формирует инструкцию SQL в виде текстовой строки. Команда PREPARE дает указание серверу произвести синтаксический анализ информации, оптимизировать и создать план выполнения запроса. Программа передает серверу инструкцию на его выполнение с помощью команды EXECUTE:

PREPARE <идентификатор SQL-предложения> FROM <базовая переменная>;

EXECUTE <идентификатор SQL-предложения > USING <базовая переменная> [INTO <базовая переменная>];

Пример: (фрагмент программы)

<объявление переменных>

strcopy (stm1, 'UPDATE order SET order.order_quantity = ? WHERE order.order_id = ?');

EXEC SQL PREPARE statement1 FROM :stm1;

EXEC SQL EXECUTE statement1 USING :order_quant, :order_id;

2.2.15. прикладной Интерфейс субд

Интерфейс предоставляет программисту библиотеку стандартных функций, которые могут вызываться из программы на языке высокого уровня для организации работы с базой данных. Начиная с первой реализации системы SQL Server (Sybase) применен принципиально новый подход – с СУБД поставляется дополнительная библиотека функций, представляющая собой API-интерфейс (Aрplication Program Interface) СУБД. Прикладная программа вызывает соответствующие функции для передачи СУБД инструкции SQL и для получения от СУБД результатов запросов. Типичная схема применения SQL API:

- программа получает доступ к базе данных путем вызова функций, подключающих программу к СУБД и к конкретной БД;

- для передачи инструкций SQL в СУБД программа формирует инструкцию в виде текстовой строки и затем передает в качестве параметра API-функции;

- программа проверяет состояния инструкции и ошибок;

- если инструкция является запросом на выборку, то результаты запроса записываются в переменные (за один вызов возвращается одна строка или один столбец);

- программа выполняет отключение от СУБД.

Каждая СУБД имеет свой набор функций API-интерфейса. Корпорация Microsoft разработала универсальный программный интерфейс (библиотека DLL) для доступа к базам данных Open Database Connectivity – ODBC. Он включает:

- менеджер драйверов, который выполняет загрузку соответствующего драйвера СУБД по требованию приложения;

- драйверы, которые обрабатывают вызовы функций ODBC и направляют SQL-запросы в конкретные источники данных, а также возвращают полученные результаты приложению. При необходимости драйверы выполняют модификацию исходного запроса в целях приведения к синтаксису конкретной СУБД.

Microsoft продолжает развивать новые поколения интерфейсов доступа к БД, включая стандартный COM-интерфейс OLE DB, ADO, DAO и т.д.

Корпорация Borland разработала свою архитектуру доступа к данным Borland Database Engine – BDE. Это единый набор функций обработки локальных и серверных БД. При этом организован промежуточный интерфейс, транслирующий обращения к функциям BDE в ODBC – вызовы. Вместе с тем в BDE для ряда СУБД имеется “родной” SQLLINK без обращения к ODBC.

Для работы с БД на конкретном клиентском месте необходимо прописать источник (базу данных) в администраторе ODBC и BDE (если приложение написано на Delphi), указав вид СУБД, имя файла базы данных (Database), пользовательское имя базы (Name), имя сервера (Server), а также идентификатор (Login ID) и пароль (Password). Работа с базой данных поддерживается администратором посредством выполнения ряда необходимых функций, таких как:

- установка и настройка сервера;

- модификация сервера при появлении новых версий;

- создание базы данных, включая выделение дискового пространства, и журналов транзакций;

- импорт и экспорт данных;

- создание плана резервного копирования/восстановления и его выполнения;

- разработка плана защиты пользователя и приложений.

Для администрирования сервера, управления базами данных, а также для работы с SQL используются специальные средства. Так, например, c Microsoft SQL Server поставляются SQL Server Enterprise Manager (средство администрирования сервера) и SQL Server Query Analyzer (анализатор запросов). Ниже приведен пример SQL-команды на создание базы данных:

CREATE DATABASE sample

ON PRIMARY (NAME = sample_data, FILENAME = ‘C:\mssql7\data\sampe.mdf’, size=10 MB, MAXSIZE=15MB,

FILEGROWTH=20%)

LOG ON (NAME = sample_log, FILENAME = ‘c:\mssql7\data\sample.ldf’, SIZE = 3MB, MAXSIZE = 5MB,

FILEGROWTH = 1MB);

2.3. Тенденции развития СУБД

В области баз данных широкое распространение получили реляционные СУБД в традиционных бизнес-приложениях, таких как обработка заказов, учет складских запасов, банковское дело, заказ авиабилетов. Однако существуют приложения, для которых реляционные СУБД не пригодны, например:

- автоматизация проектирования (CAD);

- автоматизация производства (CAM);

- автоматизация разработки программного обеспечения (CASE);

- геоинформационные системы (GIS);

- офисные информационные и мультимедийные системы (OSI).

В них необходима организация информационных объектов сложной структуры, а нормализованность отношений реляционной модели мешает представлению сложноструктурированной информации. При этом имеют место две основные тенденции развития СУБД:

1) внедрение идей объектно-ориентированного подхода в организацию информации. Создание объектно-реляционных и объектно-ориентированных СУБД;

2) унификация подходов к организации слабоструктурированной информации. Создание XML-ориентированных СУБД, предназначенных для хранения документов.

2.3.1. Объектно-ориентированные СУБД

Начнем с основной парадигмы объектно-ориентированного подхода к программированию и к СУБД:

объектно-ориентированный подход = абстрактные типы данных + наследование + идентичность объектов;

объектно-ориентированная СУБД = объектно-ориентированный подход + возможности СУБД.

Возникновение объектно-ориентированных (ОО) СУБД определялось потребностями практики, т.е. необходимостью разработки сложных информационных систем. Однако, при наличии большого количества экспериментальных проектов, отсутствует общепринятая объектная модель данных, а также не унифицирован язык манипулирования объектными БД. Тем не менее имеются хорошие продукты и современные инструментальные системы (системы документооборота, геоинформационные системы, генераторы отчетов), основанные на идеях ОО СУБД. Назначение данного класса СУБД – организовать хранение во внешней памяти объектов, поддерживать целостность базы данных, организацию параллельного доступа, управление транзакциями, эффективное манипулирование данными.

Коротко охарактеризуем основы ОО подхода. Основным компонентом БД является объект – уникально идентифицируемая сущность, которая содержит атрибуты, описывающие состояние объектов реального мира и связанные с ним действия. При описании атрибутов используется понятие типа данных. Тип может быть сложно структурированным (множество, список, массив). Каждому объекту присваивается уникальный идентификатор. Объект инкапсулирует данные и функции в замкнутом пакете. Функции – это методы, которые определяют поведение объекта. Они могут изменять состояние объекта за счет изменения значений его атрибутов. Метод состоит из имени и тела, которое обеспечивает поведение. Сообщение является свойством взаимодействия объектов. Это запрос, направляемый одним объектом другому, чтобы тот выполнил один из своих методов. Обращение к методу: <имя объекта>.<имя метода> (<параметры>). Класс –- это шаблон для определения набора подобных объектов. Интерфейс – это спецификация класса, методы которого не хранят никакого кода. Связи (зависимость, ассоциация/использование, агрегация/включение, наследование/обобщение, реализация) определяются между парами классов. При этом поддерживается иерархия классов и наследование. Наследование позволяет определить один класс на основе другого. Совокупность связей, ведущих от одного типа к другому, называется навигацией.

Связи организуются за счет хранения идентификаторов объектов (например, в классе на конце «много» определяется атрибут, в котором хранится идентификатор объекта-родителя; в классе-родителе хранится атрибут с множеством значений идентификаторов соответствующих объектов). В объявлении связи указывается другой ее конец:

relationship <тип набора> <связываемый класс> <имя связи>

inverse <связываемый класс>::<имя связи в связываемом классе>.

Пример:

/*описание класса

class Person {

/* определение атрибутов

struct Pname {string fname, string lname};

struct Addr {string street, string city, string state};

attribute Pname name;

attribute Addr address;

attribute string tel;

attribute string sex;

attribute date date_of_birth;

/* определение связей

relationship set <Child> children

inverse Child::parent};

/*определение класса

class staff:Person

(extent staffs)

{

};

/*выборка информации

select struct (lname: x.name.lname, sex:x.sex)

from x in staff

where x.address.city = 'London';

Спецификой ОО СУБД является то, что структура и поведение информационных объектов в них объединены. При этом посредством событий активизируются соответствующие методы, заложенные в описании классов и определяющие поведение системы. Языки манипулирования, как правило, являются языками высокого уровня и основаны на навигации по экземплярам объектов. Поддерживаются также языки запросов, которые являются расширением языка SQL.

Несколько фирм – разработчиков образовали группу ODMG (Object Database Management Group) в целях определения стандартов ОО СУБД. При этом унифицирована объектная модель (Object Model – OM). Разработан стандарт языка определения объектов (Object Definition Language – ODL) и языка запроса объектов (Object Query Language – OQL). Ниже приведены обязательные характеристики ОО СУБД, декларированные ODMG:

- поддержка составных объектов;

- поддержка идентичности объектов;

- поддержка инкапсуляции (доступ к объекту только через интерфейс);

- поддержка типов или классов;

- поддержка наследования классов;

- поддержка динамического связывания (методы должны применяться к объектам разных типов);

- поддержка языка OQL, обладающего вычислительной полнотой;

- поддержка расширяемого набора типов;

- поддержка перманентности данных (данные существуют после завершения работы приложения);

- поддержка больших БД;

- поддержка параллельной работы многих пользователей;

- обеспечение восстановления после сбоев;

- предоставление простых способов создания запросов к данным.

Разработан ряд нотаций объектных моделей, в том числе нотаций Йордана-Кода, Шлеера-Меллора, Дж.Рамбо (ОМТ). Последней самой универсальной нотацией, охватывающей все аспекты объектно-ориентированного проектирования систем, является нотация UML (Unified Modeling Language).

2.3.2. Объектно-реляционные субд

Мощные серверы БД, такие как Oracle, Informix, DB2, начиная с версий 8X, наряду с поддержкой реляционно-полной модели, включают объектные расширения. Однако работа с объектами не унифицирована на уровне языка SQL. В каждом конкретном случае приняты свои решения по манипулированию объектами. Так компания Informix в свое время одна из первых развила комплекс ОО технологий в СУБД, приобретя компанию Illustra Software. При этом появился продукт Informix Universal Server. Корпорация Oracle также ввела в функциональность своего сервера ОО технологию, начиная с версии продукта Oracle 8.

Перечислим основные объектные расширения реляционно-полных серверов БД:

- большие объекты (блобы) для хранения документов, аудио-видио клипов, Web-страниц и т.д.;

- абстрактные типы данных;

- таблицы в таблицах (столбцы таблицы включают структуры или целые таблицы);

- атрибуты - коллекции (множества, списки, массивы);

- хранимые процедуры;

- уникальные идентификаторы записей и объектов.

В качестве примера проиллюстрируем работу с объектами в СУБД Oracle. Так тип объекта (Address_Type) описывается на SQL и используется для описания других объектов:

CREATE TYPE Address_Type AS OBJECT (

Street VARCHAR (50),

City VARCHAR (25),

State VARCHAR (25),

Zipcode VARCHAR (10),

Country VARCHAR (50));

CREATE TABLE sales.customers (

ID INTEGER PRIMARY KEY,

Last_name VARCHAR (50),

First_name VARCHAR (50),

Address Address_Type );

При манипулировании объектами применяется точечная запись:

SELECT Id, Last_name, First_name, Address.street, Address.city

FROM sales.customers;

Если у реляционно-полной модели сущности объединяются с помощью операции соединения, то в объектно-реляционной модели при манипулировании используются указатели на соответствующие экземпляры объекта. С помощью объектов реализуются также встроенные таблицы (например, заказы-пункты заказов):

CREATE

OR REPLACE TYPE sales.item_type

AS OBJECT (item.id INTEGER

Quantity INTEGER);

CREATE

OR REPLACE sales.item_list

AS TABLE OF sales.item_type;

 

CREATE TABLE sales.orders (

Id INTEGER PRIMARY KEY,

Order_date DATE,

Ship_date DATE,

Line_items sales.item_list);

NESTED TABLE line_items

STORE AS items;

 

SELECT item_id, quantity

FROM THE (SELECT line_items

FROM sales.orders WHERE id=1)

ORDER BY item_id;

При этом обе таблицы размещаются на близлежащем дисковом пространстве и выборка информации осуществляется по указателю без организации операции соединения, требующей больших ресурсов.

2.3.3. XML-ориентированные СУБД

Расширяемый язык разметки (eXtensible Markup Language – XML) – это язык описания документов. XML во многом похож на язык разметки гипертекста (HyperText Markup Language – HTML), который повсеместно используется для конструирования Web-страниц. В обоих случаях существует некий набор тегов, встраиваемых в текст. HTML состоит из набора предопределенных «тегов», заставляющих программы-браузеры выполнять над документом определенные действия. Обычно эти теги описывают аспекты представления, такие как стили и размеры шрифтов, размещение строк и т. д. Некоторые теги также идентифицируют ссылки на другие страницы, рисунки и графику. При этом любой браузер знает, как интерпретировать теги.





©2015- 2017 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов.