Начало работы с SYBASE SQL Anywhere
Работа с любым программным обеспечением начинается с его инсталляции. В СУБД SYBASE SQL Anywhere данная функция для каждой операционной системы решается соответствующим мастером.
ПРИМЕЧАНИЕ.
Здесь и далее под операционными системами понимаются лишь те их них, для которых разработаны версии рассматриваемой СУБД. В частности речь будет идти только о таких операционных системах, как Windows 3.х, Windows 95/98, Windows NT, OS/2, NetWare, DOS и QNX.
Вышеупомянутые мастера обладают довольно "дружественным" интерфейсом и вам только остается ответить на задаваемые вопроса. Например, необходимо указать пути для размещения компонентов СУБД, какой сетевой протокол использовать, сетевой адрес сервера или клиента и т. д. Возможно в процессе инсталляции вам понадобится помощь администратора вашей сети. По умолчанию установка компонентов СУБД осуществляется в папки (каталоги) c:\SQLAny50 и C:\SYBTOOLS. После завершения процедуры инсталляции можно приступать к работе с СУБД. Для этого следует запустить компоненты SQL Anywhere server и SQL Anywhere client или SQL Anywhere Engine. Выбор компонентов определяется используемым вариантом СУБД - сетевым или автономным.
ПРИМЕЧАНИЕ.
Возможности СУБД SYBASE SQL Anywhere рассматриваются применительно к . Создание этой базы данных было произведено в среде операционной системы Windows 95. (В других операционных системах это осуществляется примерно таким же образом.) Компоненты СУБД были установлены в папки c:\SQLAny50 и C:\SYBTOOLS. Для работы с локальным сервером на одной из клиентских ЭВМ база данных Biblia была записана в файл e:\database\biblia.db. При использовании сетевой версии СУБД, эта база данных была размещена на ЭВМ - сервере в файле с:\database\biblia.db. При работе в сети использовался сетевой протокол IPX. ЭВМ, которая применялась в качестве сервера, имела сетевое имя Serv_Dbase.
Запуск клиентской компоненты СУБД
После начала функционирования удаленного сервера баз данных можно начинать использование СУБД с клиентских ЭВМ. При этом первым шагом должен быть запуск компоненты SQL Anywhere client. Данное действие может быть выполнено при помощи соответствующей пиктограммы или с использованием командной строки. При этом упрощенный синтаксис содержимого командной строки имеет вид:
| где | |
Как и для удаленного сервера, для удаленного клиента желательно указывать используемые сетевые протоколы.
Для некоторых приложений в непосредственном запуске компоненты SQL Anywhere client нет необходимости. К числу таких приложений относятся SQL Central и ISQL и ряд других приложений. Данное обстоятельство объясняется тем, что эти приложения сами запускают компоненту SQL Anywhere client.
При инициализации клиентской компоненты на экране монитора появляется ее окно. Чтобы увидеть содержимое этого окна следует запустить клиентскую компоненту. Для воспользуемся командной строкой. В ней следует ввести следующую команду:
c:\SQLany50\WIN23\Dbclient.exe Server_ste1.
Содержимое окна клиентской компоненты очень похоже на содержимое окна удаленного сервера в начальный момент его работы. Его вид представлен ниже на рис. 5.

Рис. 5. Содержимое окна клиентской компоненты СУБД SYBASE SQL Anywhere после ее инициализации
В этом окне видно, что произошла инициализация ряда сетевых протоколов. Удаленный сервер опознан при обмене с использованием сетевого протокола IPX.
После завершения процедуры инициализации окно клиентской компоненты автоматически сворачивается и представляется в панели задач в виде кнопки с названием используемого удаленного сервера.
В результате проведенных действий СУБД SQL Anywhere готова к работе с клиентскими приложениями.
Запуск локального сервера
Для автономного варианта СУБД следует запустить локальный сервер. Для этого в используемой операционной системе достаточно воспользоваться соответствующей пиктограммой. В противном случае необходимо использовать командную строку. Ее содержимое в соответствие с упрощенным синтаксисом должно имеет вид:
| где | |
По умолчанию, если имя сервера не задано, то в этом качестве используется имя файла указанное в параметре
После запуска локального сервера на окне монитора появляется специальное окно с именем сервера. В нем отображается информация о функционировании локального сервера. В частности в это окно выводится информация о времени установления и разрыва соединений пользователей, о произошедших точках фиксации и ряде других событий.
Запустим локальный сервер в среде операционной системы Windows 95/98 при помощи командной строки со следующим содержимым:
c:\SQLany50\WIN95\Dbeng50.exe c:\database\biblia.db
Тогда окно локального сервера будет иметь вид представленный на рис. 2.

Рис. 2. Окно локального сервера СУБД SYBASE SQL Anywhere
Анализируя рис. 2 можно отметить, что на нем представлено окно локального сервера Biblia. Этот сервер управляет функционированием . Ее базовым файлом является файлом с именем e:\database\biblia.db. При работе с этой базой данных используется журнал изменений, находящийся в файле BIBLIA.LOG. СУБД находится в режиме ожидания запросов и в начале ее работы уже была точка фиксации.
Запуск удаленного сервера
Допустим теперь, что в вашем распоряжении имеется сетевой вариант СУБД. Тогда для начала работы с ним необходимо сначала на ЭВМ-сервере запустить компоненту SQL Anywhere server, а затем на клиентских ЭВМ - запустить SQL Anywhere client. Для запуска компоненты SQL Anywhere server (удаленного сервера) можно воспользоваться пиктограммой соответствующей данной компоненте. Другая возможность реализации этого действия состоит в использовании командной строки. Для этой цели в нее следуют ввести строку, упрощенный синтаксис которой имеет вид:
| где | |
Приведенных сведений достаточно для начала работы с сервером базы данных. Более полную информацию и технические подробности вы можете найти в документации по СУБД.
После начала работы удаленного сервера он открывает на экране монитора окно, позволяющее контролировать его функционирование. Данное окно содержит в себе три вложенных окна:
В процессе инициализации удаленного сервера базы данных его окно содержит только одно вложенное окно - окно Messages. В этом окне отражается протокол процесса разворачивания сервера.. Для того, чтобы проанализировать содержимое окна Messages на этот момент запустим удаленный сервер. С этой целью введем в командной строке следующую команду
c:\SQLany50\WIN95\Dbsrv50.exe c:\database\biblia.db -o Server_ste1.
Тогда окно Messages в момент разворачивания сервера будет иметь вид, представленный на рис. 3.

Рис. 3. Окно удаленного сервера СУБД SYBASE SQL Anywhere при его инициализации
На рис. 3 видно, что в окне отражается название фирмы разработчика СУБД. имя владельца копии СУБД. Удаленный сервер имеет название Server_ste1. Он успешно выполнил активизацию программного интерфейса DDE и сетевых протоколов NetBios, TCP/IP, IPX и NetDG. Активизация всех этих сетевых протоколов происходит в связи с тем, что при запуске удаленного сервера на был указан используемый сетевой протокол.
Сервер управляет , расположенной в файле c:\database\biblia.db. Журнал изменений базы данных расположен в файле BIBLIA.LOG. Сервер ожидает поступления запросов. Инициализации удаленного сервера завершилась точкой фиксации. После этого в окне сервера появляются все три вышеуказанных вложенных окна. Как выглядит при этом окно удаленного сервера можно увидеть на рис. 4.

Рис. 4. Окно удаленного сервера СУБД SYBASE SQL Anywhere после его инициализации
Рассмотрим назначение каждого из вложенных окон сервера.
Окно Connection предназначено для отображения всех соединений, осуществленных с сервером, в текущий момент работы сервера. Такая информация позволяет определить количество работающих с сервером пользователей. Пользователи могут работать с разными базами, управляемых сервером. При этом один и тот же пользователь с одного и того же рабочего места может одновременно осуществлять взаимодействие с одной и той же базой данных. Поэтому вас не должен смущать этот факт когда в дальнейшем вы будете одновременно работать с посредством утилит SQL Central и ISQL.
В окно Messages выводится такая же информация, что и в окно локального сервера. Это относится и к сообщениям формируемым оператором MESSAGE. Данные сообщения, так необходимые пользователям при отладке приложений, не отображаются на клиентской ЭВМ. Поэтому пользователям предоставляется в распоряжение утилита DBWACTH. Эта утилита представлена одноименным файлом. Она позволяет отображать содержимое окна удаленного сервера на ЭВМ клиента, тем самым предлагаемая утилита предоставляет возможность анализировать сообщения выдаваемые серверу. Для применения этой утилиты можно воспользоваться соответствующей пиктограммой или командной строки. В последнем случае упрощенный синтаксис ее содержимого будет иметь следующий вид:
| где | |
| DBF | Имя файла базы данных |
| DBN | Имя базы данных |
| ENG | Имя сервера |
| UID | Имя пользователя |
| PWD | Пароль пользователя |
Использование файлов, хранящих параметры соединения
Использование файлов, хранящих параметры соединения является одной из возможностью установления соединения с базами данных. В качестве примера опять воспользуемся утилитой SQL Central.
Как видно из рис. 8, при установлении соединения с базой данных в диалоговое окно требуется вводить довольно много информации. Однако эти данные можно ввести один раз, запомнить в специальном файле и затем просто использовать этот файл. Такие файлы называются профайлами (connection profiles). Для того, чтобы воспользоваться этими файлами необходимо выполнить команду Tools|Connection profiles. В результате этого появляется окно Connection Profiles со списком имеющихся профайлов (рис. 11).

Рис. 11. Окно Сonnection Profiles со списком имеющихся профайлов
Для создания нового профайла следует нажать на кнопку New. Вследствие этого на экране появляется еще одно окно - окно Create New Profile (рис. 12).

Рис. 12. Окно Create New Profile
После того как вы введете название профайла Biblia_profile и щелкните мышью по кнопке OK. Тогда на экране появится полное окно параметров соединения SQL Anywhere Logon (). Заполним его теми же данными и щелкнем по кнопке OK. Вследствие проведенных действий список, профайлов пополнится еще одним элементом - Biblia_profile (рис. 13).

Рис. 13. Окно Сonnection Profiles с вновь созданным профайлом
Для того, чтобы воспользоваться одним из профайлов для установления соединения, необходимо выделить мышью требуемый профайл. Далее следует щелкнуть мышкой по кнопке Connect.. Тогда в случае правильно установленных значений параметров соединения произойдет подключение к базе данных ().
С помощью кнопок Edit или Remove вы можете отредактировать или удалить любой профайл. Кнопка Set Startup предоставляет вам возможность автоматического подключения базы данных при помощи профайла при запуске SQL Central. Для этого следует установить признак Use on Startup в состояние Yes. , что и сделано для профайла Biblia_profile. Задание значений для данного признака (Yes/No) осуществляется кнопкой Set Startup.
Таким образом, в результате создания профайла Biblia_profile при очередном использовании SQL Central автоматически будет подключена база данных Biblia ().
ПРИМЕЧАНИЕ
При создании профайла вам предлагается заполнить поля окна SQL Anywhere Logon (), в том числе UseID и Password. Если вы заполните их, тогда другие пользователи без особых проблем смогут узнать ваше пользовательские имя и пароль. Последствия этого не трудно предугадать. В связи с этим имеет смысл оставлять данные поля пустыми. При установление соединения посредством такого профайла будет произведена неудачная попытка установления соединения. В результате на экран будет выдано сообщение об ошибке о неверном имени пользователя или пароля и будет предложено ввести их ззаново. После заполнения полей UseID и Password осуществите еще одну попытку, которая на этот раз должна оказаться успешной. Такая процедура несколько увеличит время соединения с базой данных, но усложнит возможность раскрытия вашего имени и пароля.
Параметры соединения и способы их передачи серверу
Перечень параметров соединения и их типы данных их значений представлены в табл. 2.
Таблица 2. Перечень параметров соединений
| Agent | Agent | Строка (Client или Engine) |
| AutoStop | AutoStop | YES или NO |
| ConnectionName | CON | Строка |
| DatabaseFile | DBF | Строка |
| DatabaseName | DBN | Строка |
| DatabaseSwitches | DBS | Строка |
| DataSourceName | DSN | Строка |
| EngineName | ENG | Строка |
| Integrated | YES или NO | |
| Password | PWD | Строка |
| Start | Start | Строка |
| Userid | UID | Строка |
Поясним назначение этих параметров.
Agent . Этот параметр используется для разрешения противоречий когда на одной ЭВМ выполняется и локальный сервер и клиентская компонента сетевого варианта СУБД. Чтобы указать, что происходит подключение к локальному серверу необходимо задать Agent=engine. В случае обращения к клиентской компоненте следует определить Agent=client.
AutoStop - признак автоматического закрытия базы данных. Если AutoStop=YES, то в случае когда с базой данных произошел разрыв последнего соединения происходит автоматическое закрытие базы данных на сервере. Применение рассматриваемого параметра имеет смысл только при установлении соединения с еще не открытой базой данных. В противном случае действует значение этого параметра определенное в первом среди всех установленных соединений.
ConnectionName - имя соединения. Позволяет различать соединения установленные одним и тем же пользователем к одной и той же базе данных.
DatabaseFile - имя базового файла базы данных, с которой происходит соединение. Как и для предыдущего параметра, использование данного параметра необходимо при установлении соединения с еще не открытой базой данных.
DatabaseName - имя подсоединяемой базы данных. После установления первого соединения с базой данных подключение к ней других пользователей может быть осуществлено по ее имени. По умолчанию имя базы данных определяется именем базового файла базы данных.
DataSourceName - имя ODBC-источника данных. Данный параметр используется только СУБД с интерфейсом ODBC.
DatabaseSwitches - режимы использования базы данных. Он позволяет задавать, отличные от используемых по умолчанию, режимы использования баз данных. К их числу относятся определение псевдонима для имени базы данных (-v name), обнуление журнала изменений базы данных после каждой точки фиксации (-m) и запись в этот журнал старых значений полей при выполнении оператора UPDATE (-v). Данный параметр действует только на открываемую базу данных.
EngineName - имя локального или удаленного сервера базы данных. Этот параметр требуется только в том случае если работает несколько серверов баз данных.
Integrated - признак совместного использования средств идентификации пользователей СУБД и операционной системой или вычислительной сетью. Если Integrated=YES, то одни и то же имя пользователя и пароль используются для доступа ко этим системам. Применяется только для локального и удаленного сервера в операционной системе Windows NT, а также для клиентов в Windows 95/98 и WindowsNT.
Password - пароль пользователя. При установлении соединения пароль вводится всегда.
Start - режимы функционирования сервера баз данных. Всего таких режимов более 30. Они позволяют установить перечень разрешенных к использованию сервером сетевых протоколов (-x net_list), блокировать клавиатуру сервера (-l password), задать размер используемой сервером кэш-памяти (-c cache-size) и т.д.
Userid - имя пользователя. Как и пароль, всегда должен использоваться при подключении к базе данных.
При установлении соединения нет необходимости использовать все параметры соединения. Исключение составляют только параметры Userid и Password, которые должны задаваться всегда. Использование параметров EngineName, DatabaseName и DatabaseFile определяется наличием одновременно функционирующих серверов и количеством открытых баз данных. Например, запущен только один сервер и открываемая база данных должна управляться этим сервером. Тогда нет необходимости указывать значение параметра EngineName. Если требуемая база данных уже открыта, то можно обойтись еще и без параметров DatabaseName и DatabaseFile. Такую аналогию можно продолжать и далее. Параметр DataSourceName необходим для приложений использующих интерфейс ODBC. Для остальных параметров определены значения по умолчанию. По этой причине, если нет необходимости, их значения можно не задавать.
При подключении к базе данных параметры соединения могут передаваться одним из следующих способов:
Рассмотрим примеры установления соединения наиболее часто применяемыми способами.
Передача параметров соединения через источники данных ODBC
Интерфейс ODBC был разработан фирмой MicroSoft в качестве унифицированного средства для доступа к реляционным базам данных, управляемых различными СУБД. Для пользователей он представляется в виде совокупности функций и источников данных. Под источниками данных здесь подразумеваются объекты являющиеся связующим звеном между базами данных и их приложениями. Источники данных осуществляют взаимодействие с базами данных через ODBC-драйверы. Такие драйверы поставляются фирмами-разработчиками СУБД. Создание и настройка источников осуществляется пользователями, а интерфейсные функции предоставляет фирма MicroSoft. После настройки источника данных, его имя используется в приложениях в качестве псевдонима для обращения к соответствующей базе данных. Рассмотрим как создается источник данных для баз данных, управляемых СУБД SYBASE SQL Anywhere.
Интерфейсом ODBC можно воспользоваться только в том случае если на вашей ЭВМ установлен Администратор MicroSoft ODBC. О его наличии свидетельствуют пиктограммы 32bit ODBC или ODBC в Панели управления. Эти пиктограммы обозначают различные типы Администратора MicroSoft ODBC. Один из типов предназначен для организации взаимодействия баз данных с 16-разрядными приложениями, для другой - с 32-разрядными. Разрядность приложений в зависимости от типов Администратора для различных Windows-операционных систем представлена в табл. 3.
Таблица 3. Разрядность приложений в зависимости от типов Администратора ODBC
| ODBC | 16 | 16 | 32 |
| 32bit ODBC | - | 32 | - |
Для создания нового источника ODBC щелкните мышкой по пиктограмме 32bit ODBC или ODBC. Тогда на экране появится окно Администратора MicroSoft ODBC со списком уже имеющихся источников данных(рис. 14).

Рис. 14. Окно Администратора MicroSoft ODBC имеющихся источников данных
Чтобы добавить к существующим еще один источник данных щелкните мышью по кнопке Add. В результате этого вам будет предложено выбрать ODBC-драйвер (рис. 15).

Рис. 15. Выбор ODBC-драйвера Sybase SQL Anywhere 5.0
Так как мы создаем источник данных для СУБД SYBASE SQL Anywhere, то следует выбрать драйвер Sybase SQL Anywhere 5.0. Чтобы подтвердить сделанный выбор, щелкните мышкой по кнопке Готово. После этого вашему вниманию будет представлено диалоговое окно SQL Anywhere ODBC Configuration для задания характеристик создаваемого источника данных (рис. 16).

Рис. 16. Задание характеристик создаваемого ODBC-источника данных
В рассматриваемом диалоговом окне поле Data Source Name предназначено для определения названия источника данных. В поле Description может храниться краткий комментарий к создаваемому источнику данных. Области Connection Information и Database Startup практически полностью соответствуют полному окну параметров соединения утилиты SQL Central (). Исключение составляет реакция при щелке мыши по кнопке Options. При наступлении этого события открывается окно Startup Options (рис. 17).

Рис. 17. Диалоговое окно Startup Options
В данном окне поля Start Command, Database Switches и флажок Autostop Database предназначены для определения параметров DatabaseSwitches, Start и AutoStop, соответсвенно. Область Agent служит для задания значения одноименного параметра соединения. Поле Isolation Level не предназначено для параметров соединения. Оно служит для ввода значения параметра функционирования базы данных Isolation_level (уровня изолированности). Этот параметр характеризует степень обеспечения целостности данных при работе с базой данных в режиме коллективного доступа. Параметр Isolation_level может принимать значения 0, 1, 2 или 3. По умолчанию значение этого параметра равно 0.
Продолжим анализировать характеристики ODBC-драйвера (). Следует отметить, что ввод значений в поля User Id и Password не является обязательным. Более того это не желательно. Если имя и, особенно пароль, определены в источнике данных, то они могут быть беспрепятственно считаны другими пользователями. Это может привести к возможности несанкционированного доступа, а затем и к непредсказуемым последствиям. Если значения параметров соединений Userid и Password в источнике данных не заданы, тогда ввод их осуществляется при соединении с базой данных.
Рассмотрим область Additional Connection Options. Иногда при использовании источника данных возникает необходимость преобразования данных символьных типов из ANSI-кодировки (для Windows) в OEM-кодировку (для DOS) и обратно. Тип конвертора для этого случая задается в поле Translator Name. Выбор конвертора осуществляется при помощи кнопки Select.
Из видно, что источник данных Biblia предназначен для связи приложений пользователя Stepanov с , управляемой удаленным сервером Server_ste1. При использовании созданного источника данных будет производиться преобразования символов из ANSI-кодировки в OEM-кодировку и обратно.
После установления соединения ворота, преграждавшие путь к данным, открыты. Вам остается пройти через них и начать свое путешествие по лабиринтам хранилища информации.
Соединения при помощи диалогового окна
Характерными примерами подключения к базам данных через диалоговое окно соединения является организация этой процедуры в утилитах SQL Central и ISQL. Рассмотрим соединение с использованием такого окна на примере утилиты SQL Central. Для запуска SQL Central в среде Windows 95/98 или Windows NT 4.0 щелкните левой кнопкой мыши на кнопке Ione, затем выберите в появившемся меню пункт Программы. После этого следует в предлагаемом перечне программ указать на SYBASE SQL Anywhere и далее выбрать SQL Central и дважды щелкнуть левой кнопкой мыши. Если данная утилита запускается из Windows NT 3.51, то вам следует также использовать двойной щелчок левой кнопкой мыши по пиктограмме SQL Central в программной группе SYBASE SQL Anywhere. После этого на экране появляется главное окно утилиты (рис. 6).

Рис. 6. Главное окно утилиты SQL Central
Для установления соединения следует выполнить команду меню Tools|Connect или щелкнуть мышкой по кнопке, на которую указывает курсор (см. рис. 6). Если требуемая база данных открыта, то нет необходимости в передаче параметров EngineName. DatabaseName и DatabaseFile. В этом случае вышеуказанные утилиты предлагают пользователю заполнить поля сокращенного диалогового окна параметров соединения (рис. 7).

Рис. 7. Сокращенное диалоговое окно параметров соединения утилит SQL Central и ISQL
После ввода значений параметров Userid и Password необходимо щелкнуть левой клавишей мыши по кнопке OK. В случае отказа от соединения следует воспользоваться кнопкой Cancel.
ПРИМЕЧАНИЕ
В дальнейшем будем предполагать, что соединение с базаой данных Biblia осуществляется пользователем-администратором, имя которого Stepanov, а пароль - s.
Если необходимо задать значения и других параметров щелкните мышью по кнопке More>>. Тогда вместо сокращенного на экране появится полное окно параметров соединения. В необходимых случаях утилита SQL Central сразу использует полное диалоговое окно параметров соединения. Такое окно представлено на рис. 8.

Рис. 8. Полное диалоговое окно параметров соединения утилиты SQL Central
Поля данного окна предназначены для ввода значений соответствующих параметров соединений. Все эти поля заполняются вручную, а полное имя файла для поля Database File может также выбрано после использования кнопки Browse.
В рассматриваемом окне следует обратить на область Database Startup. В ней сосредоточена информация о подключаемой базе данных. Помимо имени базового файла, вы можете при помощи переключателя указать тип сервера (локальный или удаленный) будет управлять подсоединяемой базой данных. Если переключатель установлен в положении Local, то используется локальный сервер, если в положении Network, то - удаленный. При этом значения параметров соединения AutoStop, DatabaseSwitches и Start определяются по умолчанию.
Если возникает потребность в явном задании их значений, то переключатель должен быть установлен в положение Custom. Вследствие этого становится доступной кнопка Custom. После щелчка по ней мыши открывается диалоговое окно Custom Database Startup (рис. 9).

Рис. 9. Диалоговое окно Custom Database Startup
Содержимое поля Database Startup Command Line в случае использования локального сервера должно соответствовать следующему синтаксису:
SERVER [РЕЖ_БД ...] [РЕЖ_СЕРВ ...],
| где | SERVER - полный путь к файлу, представляющего компоненту SQL Anywhere Engine; |
| РЕЖ_БД - необязательный параметр режим использования базы данных; | |
| РЕЖ_СЕРВ - необязательный параметр режим функционирования сервера баз данных. |
CLIENT [РЕЖ_КЛИЕНТ ...],
| где | CLIENT - полный путь к файлу, представляющего компоненту SQL Anywhere Client; |
| РЕЖ_КЛИЕНТ - необязательный параметр режим функционирования клиентской компоненты СУБД. |
Анализируя содержимое диалоговых окон SQL Anywhere Logon и Custom Database Startup, представленных на рис. , можно отметить следующее. Производится установление соединения с базой данных Biblia. Она будет функционировать под управлением удаленного сервера Server_ste1. Обмен информацией с сервером будет осуществляться при помощи сетевого протокола IPX. Базовый файл базы данных Biblia находится на ЭВМ с сетевым именем Serv_Dbase.
Теперь после того как требуемые поля параметров соединения заполнены можно осуществить подключение к . Для этого необходимо щелкнуть мышкой по кнопке OK в сокращенном или полном окне параметров соединения (см. рис. , ). Тогда, если параметры соединения заданы правильно, произойдет установления соединения. При этом происходит запуск клиентской компоненты SQL Anywhere, после чего в Панели задач появится кнопка с названием сервера Server_ste1. Затем на переднем плане появится окно утилиты SQL Central, в котором произошли некоторые изменения по сравнению с его первоначальным видом (). Так в левой панели окна утилиты появится значок работающего сервера в виде монитора с именем сервера справа от него. В нашем случае сервер называется Server_ste1. Щелкните мышью слева от значка сервера по значку "+". Тогда можно будет увидеть все базы данных, работающие под управлением сервера Server_ste1 (рис. 10). В нашем случае это только . Тут же в скобках указано имя пользователя установившего соединение - Stepanov.

Рис. 10. Отображение факта соединения в утилите SQL Central
После того как соединение с базой данных установлено можно производить манипулирование ее объектами.
Установление соединения с базой данных
Любой пользователь перед тем как начать свою работу с требуемой базой данных должен произвести соединение с ней. На основании информации, передаваемой СУБД через параметры соединения, происходит:
Данные действия осуществляются на основании значений параметров, передаваемых серверу при подключении к базе данных Какие при этом используются параметры приведено ниже.
Установления соединения через командную строку
Покажем применение командной строки для установления соединения с базой данных на примере утилиты DBWATCH. Данная утилита позволяет отображать окно сервера на экране монитора клиентской ЭВМ.
Рассматриваемая утилита для своей работы должна осуществить подключение от имени зарегистрированного пользователя одной из баз данных управляемых сервером. Именно этим объясняется перечень параметров утилиты DBWATCH, представляющих собой строку параметров соединения. Запустим рассматриваемую утилиту для отображения окна сервера Server_ste1 от имени пользователя Stepanov, зарегистрированного в . Для этого командная строка должна иметь следующий вид:
c:\SQLAny50\Win32\Dbwatch.exe -c "ENG=Server_ste1; DBN=Biblia; UID=Stepanov; PWD=s"
Если параметры соединения указаны правильно и удаленный сервер работает, то на экране клиентской ЭВМ появится копия окно удаленного сервера.
Остальные утилиты
Многие действия в SQL Anywhere выполняются при помощи ее утилиты. Особого внимания среди них заслуживают утилиты SQL Central и ISQL. Каждая из них позволяет запускать другие утилиты. В SQL Central для использования утилит необходимо раскрыть папку Utilities, выбрать и запустить соответствующий требуемой утилите мастер. При этом вам будет предложено в интерактивном режиме ввести параметры, после чего будет запущена выбранная утилита. В ISQL для того, чтобы воспользоваться одной из утилит, необходимо выполнить SQL-оператор DBTOOL. Упрощенный синтаксис этого оператора имеет следующий вид:
DBTOOL НАЗВ_УТИЛ ПАР_УТИЛ,
где
НАЗВ_УТИЛ - название утилиты в ISQL;
ПАР_УТИЛ - параметры утилиты.
Любую из рассматриваемых утилит можно просто запустить из командной строки. Они хранятся в одном из каталогов, в зависимости от используемой операционной системы, вложенных в каталог SQLANY50. Для понимания возможностей, предоставляемых пользователям, кратко рассмотрим эти утилиты. Для удобства все они, за исключением SQL Central и ISQL, сведены в табл. 5 и 6.
SQL Central - средство администрирования баз данных
Администрирование базами данных в SQL Anywhere осуществляется SQL-операторами в утилите ISQL и дополнительными утилитами, запускаемыми из командной строки. Это крайне неудобно. Об этом хорошо должны помнить пользователи со стажем, вкусившие всю "прелесть" работы с командной строкой MSDOS. Здесь ситуация весьма схожая. Однако пользователям работающим в среде операционных систем Windows 95 или Windows NT не ощутят этой рутины. Вы спросите почему? Ответ заключается в наличии утилиты SQL Central. Все действия в ней осуществляют при минимальном объеме вводимых данных с использованием мыши.
Утилита SQL Central позволяет создавать базы данных. Для каждой базы данных эта утилита позволяет определить ее схему, осуществить установку режимов использования, создать любые объекты, кроме системных таблиц, придать требуемые свойства объектам, воспользоваться набором дополнительных утилит и выполнить еще ряд других действий. Все действия, осуществляемые SQL Central, можно разделить на два вида:
Для запуска SQL Central в среде Windows 95 или Windows NT 4.0 щелкните левой кнопкой мыши на кнопке Пуск, затем выберите в появившемся меню пункт Программы. После этого следует в предлагаемом перечне программ указать на SYBASE SQL Anywhere и далее выбрать SQL Central и дважды щелкнуть левой кнопкой мыши. Если данная утилита запускается из Windows NT 3.51, то вам следует также использовать двойной щелчок левой кнопкой мыши по пиктограмме SQL Central в программной группе SQL Anywhere. Если соответствующая пиктограмма отсутствует, то следует воспользоваться командной строкой. Исполняемый файл SQL Central называется Scview.exe. В зависимости от используемой операционной системы он находится в одном из каталогов (папок) вложенных в каталог (папку) SYBTOOLS.
После запуска SQL Central на экране появляется главное окно утилиты. При этом в нашем случае сразу же произойдет автоматическое подключение под именем пользователя Stepanov к . управляемой удаленным сервером Server_ste1. Дело в том ранее мы уже создали профайл Biblia_profile с признаком Use on Startup=Yes (см. рис. - ). В результате подключения окно утилиты SQL Central примет вид, представленный на .
ПРИМЕЧАНИЕ
Необходимо помнить, что перед установлением соединения с базой данных, управляемой удаленным сервером, предварительно должен быть запущен сервер базы данных.
Интерфейс SQL Central построен на тех принципах, что интерфейс программы Проводник, входящей в состав Windows 95 и Windows NT 4.0. В связи с этим, естественно, что их окна имеют примерно одинаковый внешний вид. Как и в Проводнике в SQL Central одно и тоже действие можно сделать несколькими способами. В дальнейшем при использовании SQL Central будет рассматривать только один из возможных способов.
Основное окно SQL Central состоит из двух вертикальных панелей (). В левой панели отображается древовидная структура элементов, которыми манипулирует утилита. Такими элементами являются подключенные база данных и их объекты, а также серверы, управляющие их работой. Элементы могут быть простыми и сложными. Сложные элементы содержат в себе другие сложные или простые элементы. Например, сервер может управлять несколькими базами данных, база данных содержит несколько таблиц и т.д. По аналогии с проводником будем называть сложные элементы папками. Простые элементы являются неделимыми элементами. К их числу относятся поля таблиц, тела хранимых процедур и т.д.
Правая панель служит для индикации содержимого папки (сложного элемента), выделенной в левой панели. Как и в Проводнике, содержимое любой папки может быть визуально представлено в виде мелких или крупных значков (иконок), а также в виде списка или таблицы при помощи пункта View главного меню SQL Central.
На папка сервера Server_ste1 представлена в раскрытом состоянии, папка базы данных Biblia - в закрытом. Об этом свидетельствует знак "-" слева от папки сервера и знак "+" слева от папки базы данных. Для того, чтобы раскрыть папку необходимо щелкнуть мышью по знаку "+" или дважды мышью по самой папке. В результате содержимое папки будет представлено в виде совокупности вложенных папок. При этом знак "+" изменится на знак "-". Если эти знаки слева от папки отсутствуют, то следовательно в ней нет вложенных папок. Знак "+"означает, что папка содержит другие папки.
Если один раз щелкнуть мышью по папке в левой панели, ее пиктограмма примет вид раскрытой папки. При этом название этой папки появится в заголовке окна SQL Central, а ее содержимое отобразится в правой панели. Если эту манипуляцию произвести с папкой в правой панели, то вместо нее в этой панели появится содержимое выбранной папки. В названии окна никаких изменений не произойдет. Раскрывая и закрывая содержимое папок левой панели, можно выбрать требуемый уровень отображения информации в иерархической древовидной структуре. Один из вариантов представления иерархии объектов приведен на .

Рис.18. Представлении иерархии объектов базы данных Biblia в окне SQL Central
На рис. 18 видно, что в левой панели выбрана папка Columns таблицы Books, о чем свидетельствует присутствие названия папки в заголовке окна утилиты и ее пиктограмма в виде раскрытой папки. В правой панели представлены поля таблицы Books.
ПРИМЕЧАНИЕ
В утилите SQL Central не все сложные элементы - папки визуально представляются папками. Пиктограммы некоторых папок изображаются в виде монитора - для сервера, таблицы- для таблиц и т.д.
Продолжая аналогию с Проводником, следует сказать, что если щелкнуть правой кнопкой мыши по одному из элементов, то на экране появится контекстное меню. Данное меню содержит в виде пунктов перечень допустимых операций над выбранным элементом. Как и Проводнике, такое меню, как правило, содержит пункт Properties, позволяющий проанализировать свойства элемента.
Некоторые элементы, которыми манипулирует SQL Central, могут быть удалены или скопированы. Для выполнения этих действий требуемые элементы должны быть выделены. Выделение одного элемента можно производить в обоих панелях, в то время как для группы элементов произвести такое действие возможно только в правой панели. Выделение одного элемента осуществляется щелчком мыши. Выделение группы элементов производится мышью при нажатой клавише Ctrl. Если выделяемые элементов следуют подряд один за другим, то для их выделения достаточно выполнить следующие действия. Выделите сначала первый элемент, а затем удерживая клавишу Shift щелкните мышью по последнему элементу.
Удаление элементов выполняется одним из следующих способов:
Копирование элементов в SQL Central осуществляется перетаскиванием мышкой выделенных элементов в соответствующие элементы левой панели. Например, таким образом можно скопировать описание поля Code_book или нескольких полей таблицы Books в таблицу Copies. Аналогично можно копировать таблицы, представления, а также хранимые процедуры и функции из одной базы данных в другую.
Основными элементами утилиты SQL Central его папки верхнего уровня. Каждая папка предназначена для выполнения своих строго определенных задач. Для этого она может содержать вложенные папки и мастера, которые управляются своими контекстными меню. Назначение папок верхнего уровня приводится ниже.
Папка Tables позволяет манипулировать таблицами данных. Ее элементы предназначены для задания свойств таблиц и их полей, для анализа и модификации структуры первичных и вторичных ключей, а также текстов триггеров таблиц данных.
Работа с представлениями осуществляется в папке Views. Она содержит мастер для создания представлений и список представлений базы данных. Данная папка реализует функции создания и редактирования представлений.
Ввод и модификация текстов хранимых процедур и функций является прерогативой элементов папки Procedure & Functions.
Действия по регистрации новых пользователей базы данных, определение им полномочий и объединение отдельных пользователей в группы выполняются элементами папки User & Groups.
Элементы папки SQL Remote используются при организации репликации между базами данных.
Как уже было сказано выше, физически база данных может размещаться в нескольких областях. Каждая область хранится в отдельном файле. Области базы данных могут располагаться в разных каталогах одной ЭВМ или вообще на разных ЭВМ локальной сети. Управление областями реализуется элементами папки DB Spaces.
Для получения информации о том кто в настоящее время работает с используемой базой данных достаточно раскрыть папку Connected Users.
Папки SQL Central будут использоваться в дальнейшем по мере знакомства с возможностями SYBASE SQL Anywhere. При этом следует отметить, что многие папки доступны лишь администратору базы данных.
Назначение сочетаний
.(рис. 24).

Рис.24. Окно Options режимов работы утилиты ISQL
ПРИМЕЧАНИЕ
На рис. 24 показаны режимы ISQL, используемые по умолчанию.
В окне Options область Commit служит для определения условия завершения транзакций при выполнении SQL-операторов в среде утилиты ISQL. При установленном флажке After Every Command транзакция завершается после успешного выполнения каждого SQL-оператора. Флажок When Exiting ISQL определяет завершение транзакции при завершении работы с утилитой. Как видно из рис.24, по умолчанию транзакция завершается автоматически при выходе из ISQL. В этом есть глубокий смысл. Дело в том, что одной из основных задач, решаемых утилитой, является отладка программных объектов СУБД: хранимых процедур, функций и триггеров. При этом базы данных может перейти в несогласованное, нецелостное состояние. Именно поэтому в установленном состоянии находится только флажок When Exiting ISQL.
В области Data and Commands отображаются режимы для окон Data и Command утилиты. Флажок Automatic Window Refresh определяет вывод в окно Data результатов запросов, отражающих самые последние изменения базы данных.
ПРИМЕЧАНИЕ
При работе ISQL с установками по умолчанию с удаленным сервером, пользователи часто сталкиваются с такой ситуацией. После проведения изменений в таблицах при выполнении оператора Select эти изменения не выводятся в окне Data. Дело в том, что при выполнении транзакции страницы с обрабатываемыми данными считываются в виртуальную память транзакции. Все манипуляции с данными осуществляются только в виртуальной памяти. После завершения транзакций все страницы из виртуальной памяти записываются в базу данных. В утилите ISQL по умолчанию транзакция завершается только при выходе из утилиты. По этой причине все произведенные изменения данных хранятся в виртуальной памяти транзакции. Оператор Select по умолчанию считывает информацию непосредственно из базы данных. Именно это является причиной возникновения рассматриваемой ситуации.
Установленное значение флажка Show Column Headings указывает необходимость вывода названий полей в окне Data. Если флажок Beep on Errors находится в установленном состоянии, то при возникновении ошибок в процессе выполнении SQL-операторов раздается звуковой сигнал. Поле Command Delimiter предназначено для ввода символа (ов), служащего разделителем между SQL-операторов в окне Command. В поле Show Null Values As вводится последовательность символов, выводимая в окне Data вместо значений Null. Так на видно, что взамен некоторых значений поля Coauthors выводится последовательность (NULL). Пользователи могут зафиксировать все выполняемые SQL-операторы в отдельном файле. Для этого полное имя файла регистрации требуется ввести в поле Log ISQL Command to File.
ПРИМЕЧАНИЕ
В файл регистрации записываются SQL-операторы, введенные в окно Command в течение одного сеанса функционирования утилиты. При следующем запуске ISQL содержимое данного файла стирается.
Область Commands Files предназначена для установки режимов выполнения длинных последовательностей SQL-операторов. Как правило, такие последовательности хранятся в командных файлах. Флажок Echo During Execution устанавливает режим вывода SQL-операторов на экран в процессе их выполнения. В поле со списком When an Error Occurs определяется действие проводимое при возникновении ошибок в процессе выполнения SQL-операторов. По умолчанию установлен режим Prompt - выдача приглашение по выбору дальнейших действий. Альтернативами этому режиму являются режимы Continue - игнорирование ошибок, Exit - завершение работы утилиты при возникновении ошибок, Stop - прекращение выполнения последовательности SQL-операторов.
Назначением области Input/Output является управление режимами импорта/экспорта информации из/в базы данных SQL Anywhere. Поле со списком Input Format позволяет установить формат импортируемых данных, используемый по умолчанию SQL-оператором импорта данных - Input. Поле со списком Output Format служит для таких же целей, но только для экспортируемых данных - для SQL-оператора Output. Данные поля предлагают использовать разнообразные текстовые файлы и файлы систем dBASE, FoxPro, Lotus. Поле Limit Output Columns To определяет максимальное количество знаков для значений экспортируемых данных. При превышении этого значения происходит ограничение размера выводимого значения. Если лимит равен 0, то экспортируемые данные не ограничиваются в размерах. Поле Limit Display Columns To играет ту же роль для значений выводимых в окно Data утилиты.
Все произведенные установки режимов утилиты ISQL могут быть сохранены только для текущего сеанса работы утилиты при помощи кнопки OK. Чтобы установки можно было использовать и для последующих сеансов работы ISQL необходимо щелкнуть мышью по кнопке Permanent.
Назначение утилит СУБД SQL Anywhere
| 1 | Change Log File Information | Замена файла для журнала изменений базы данных |
| 2 | Backup Database | Создание резервной копии базы данных или wrt-файла |
| 3 | Compress Database | Сжатие базы данных |
| 4 | Create Database | Создание новой базы данных |
| 5 | Create Write File | Создание (замена) файла (.wrt) для хранения изменений баз данных, исходное содержание которых изменять нельзя. Например, если база данных хранится на компакт-диске |
| 6 | Выдача информации о характеристиках базы данных | |
| 7 | Erase Database | Удаление базы данных |
| 8 | Extract Database | Синхронизация баз данных при организации репликации |
| 9 | Translate Log | Формирование командного файла SQL-операторов из содержимого журнала изменений базы данных |
| 10 | Uncompress Database | Распаковка сжатой базы данных |
| 11 | Замена кодовой страницы символов | |
| 12 | Unload Database | Формирование командного файла SQL-операторов, позволяющего создать полную копию базы данных, включая таблицы, процедуры и другие объекты |
| 13 | Upgrade Database | Преобразование базы данных из устаревшего формата СУБД Watcom SQL в формат СУБД SQL Anywhere |
| 14 | Validate Database | Проверка соответствия значений первичных ключей и индексов содержимому таблиц базы данных |
Соответствие названий утилит u ISQL именам исполняемых файлов
| 1 | ALTER DATABASE | DBLOGM |
| 2 | BACKUP TO | DBBACKUP |
| 3 | COMPRESS DATABASE | DBSHRINK |
| 4 | CREATE DATABASE | DBINIT |
| 5 | CREATE/.ALTER WRITEFILE | DBWRITE |
| 6 | DBINFO DATABASE | DBINFO |
| 7 | DROP DATABASE | DBERASE |
| 8 | EXTRACT TABLES | DBXTRACT |
| 9 | TRANSLATE | DBTRAN |
| 10 | UNCOMPRESS DATABASE | DBEXPAND |
| 11 | UNLOAD COLLATION | DBCOLLAT |
| 12 | UNLOAD TABLES | DBUNLOAD |
| 13 | UPGRADE TABLES | DBUPGRAD |
| 14 | VALIDATE TABLES | DBVALID |
Рассмотрев утилиты СУБД Sybase SQL Anywhere, вы получили в свое распоряжение проводников для путешествия по хранилищу данных. Оно может быть огромным и пробираться среди их закоулков и хитросплетений без проводников не возможно. Теперь они у вас есть и вы можете продолжить свой путь.
Утилита интерактивного доступа
, в зависимости от используемой операционной системы. Эта утилита представляет собой файл Isql.exe, который находится в одном из каталогов (папок), вложенных в каталог SQLANY50.
В начале работы рассматриваемой утилиты, выдается запрос на ввод параметров соединения (). В зависимости от того открыта требуемая база или нет, запрос представляется в виде сокращенного () или полного окна параметров соединения (рис. 19).

Рис.19. Полное окно параметров соединения утилиты ISQL
Представленное окно весьма похоже на аналогичное окно утилиты SQL Central () и предназначено для ввода значений параметров соединения. По умолчанию в качестве значения параметра DatabaseName () используется имя файла, заданное в параметре DatabaseFile. В нашем случае это Biblia.
После установления соединения на экране монитора появляется главное окно ISQL (рис. 20).

Рис.20. Главное окно утилиты ISQL
Заголовок главного окна утилиты ISQL является составным. Он включает в себя наименование утилиты, название подключенной базы данных, имя пользователя, установившего соединение (в скобках), и название сервера, управляющего подключенной базой данных. Так на рис.20 видно, что пользователь Stepanov в среде утилиты ISQL установил соединение с , которой управляет сервер Server_ste1.
Главное окно рассматриваемой утилиты содержит три вложенных окна:
В начале функционирования ISQL все они пустые. Информация в них появляется в процессе работы с утилитой. При этом окно Command используется для ввода выполняемых SQL-операторов. На это окно содержит оператор выбора всех полей из таблицы Stepanov.Books. В названии таблицы фраза Stepanov обозначает имя владельца таблицы, т.е. пользователя создавшего ее. Фраза Books обозначает непосредственное имя таблицы.
ПРИМЕЧАНИЕ
Разные пользователи в одной базе данных могут создавать одноименные объекты, в том числе и таблицы. В связи с этим возникает необходимость различать их. Поэтому при обращении к конкретному объекту указывается имя его владельца, например, таблица Stepanov.Books. Если имя владельца не указано, то по умолчанию в качестве имени владельца любого объекта, кроме триггера, используется имя пользователя, обращающегося к объекту. В связи с этим пользователи могут манипулировать собственными объектами без указания их владельца.
В окне Statistics отображаются оценочные характеристики выполняемого запроса. В частности в нем отражается предположительное количество обработанных записей, ожидаемое число операций ввода-вывода, необходимых для отработки SQL-операторов, план выполнения запроса и т.п. В частности на в окне Statistics показано, что в результате выполнения запроса (см. окно Command) возможно будет выбрано 55 записей, для чего предполагается осуществить 5 операций ввода-вывода.
При выполнении SQL-операторов выбираемые данные выводятся в окно Data. Как видно на , в окне Data отображен фрагмент содержимого таблицы Stepanov.Books. Невидимую часть таблицы можно просмотреть, используя вертикальные и горизонтальные полосы прокрутки.
В некоторых случаях утилита ISQL сразу выводит на экран свое главное окно без запроса на установление соединения. Тогда подключение можно осуществить, выполнив команду меню Command|Connect или нажав на функциональную клавишу F11. В результате этого пользователю будет предложено заполнить поля сокращенного или полного окна параметров соединения (см. рис. , ). Отключение от используемой базы данных производится при помощи команды меню Command|Disconnect или функциональной клавиши F12.
В среде утилиты ISQL пользователь может непосредственно изменять только содержимое окна Command. Оно представляет собой окно обыкновенного текстового редактора. В нашем случае в него вводятся SQL-операторы. При этом пользователь может использовать клавиатуру, меню главного окна и/или функциональные клавиши.
Исполнение запросов, вводимых в окно Command, осуществляется щелчком мышью по кнопке Execute, выполнением команды меню Command|Execute или нажатием на функциональную клавишу F9. При этом, одновременно может быть выполнен не только один SQL-оператор, а целая их последовательность. В ней в конце каждого SQL-оператора ставится специальный разделитель. По умолчанию в качестве разделителя используется символ ";". Один SQL-оператор является частным случаем последовательности.
Для удобства пользователей утилита запоминает ранее выполненные последовательности. Предыдущую последовательность можно воспроизвести в окне Command, выполнив команду меню Command|Previous Command или используя комбинацию клавиш Ctrl+P. Для того, чтобы воспользоваться следующей последовательностью необходимо выполнить команду меню Command|Next Command или нажать комбинацию клавиш Ctrl+N. Пользователь может вообще просмотреть весть список выполненных последовательностей и выбрать требуемую. Для этого следует выполнить команду меню Command|Recall или воспользоваться комбинацией клавиш Ctrl+R. В результате на экране появится окно Command Recall (см. рис. 21).

Рис.21. Выбор одной из ранее выполненных последовательностей SQL-операторов в утилите ISQL
В окне Command Recall следует выделить требуемую последовательность SQL-операторов и щелкнуть мышкой по кнопке Recall. Тогда выбранная последовательность появится в окне Command. После чего ее можно выполнять, осуществив в случае необходимости ее модификацию.
Утилита позволяет сохранить любую последовательность не только в своей памяти, но и в файле. Для этого необходимо выполнить команду меню File|Save As. Файлы, содержащие последовательности SQL-операторов, в SQL Anywhere называются командными. Они имеют расширение "sql". Воспроизвести содержимое командного файла в окне Command можно, выполнив команду меню File|Open.
Утилита ISQL предоставляет сервис при вводе с клавиатуры названий таблиц, представлений и их полей. Это особенно удобно при использовании длинных имен владельцев таблиц и представлений, а также названий этих объектов баз данных. Название необходимого объекта вместо набора на клавиатуре можно выбрать из списка этих объектов. Для этого требуется всего лишь нажать клавишу F7. В результате появляется окно Tables, в котором необходимо произвести выбор (см. рис. 22).

Рис.22. Выбор названия необходимой таблицы или представления
В списке, представленном в окне Tables, можно произвести выбор любых таблиц и представлений, хранящихся в используемой базе данных, в том числе и системных. Для последних в качестве имен пользователей используются значения dbo и SYS.
Для выбора требуемого объекта следует выделить его, а затем воспользоваться кнопкой Insert. После этого в окне Command появится полное название объекта, включающее имя владельца и непосредственное название объекта. На рис. 22 произведен выбор таблицы Stepanov.Reader.
Если в окно Command необходимо ввести имя поля объекта, то тогда в окне Tables щелкните мышью по кнопке Columns. Вследствие этого на экране появится окно со списком полей выбранного объекта. В качестве имени этого окна используется полное название объекта, выбранного в окне Tables. В нашем случае данное окно называется Stepanov.Reader (рис. 23).

Рис.23. Выбор полей требуемой таблицы или представления
В этом окне необходимо выделить требуемое поле и щелкнуть мышкой по кнопке Insert. В результате в окне Command появится полное наименование поля вместе с именем владельца и названием объекта.
Из сказанного видно, что при работе в среде ISQL удобно пользоваться функциональными и управляющими клавишами. Для того, чтобы легко ориентироваться в их сочетаниях, все они приведены в табл. 4.
Утилиты Sybase SQL Anywhere
Любой пользователь работающий с СУБД Sybase SQL Anywhere не может обойтись без использования ее утилит. Две из них заслуживают особого внимания. Речь идет об утилитах SQL Central и ISQL (Interactive SQL). SQL Central - представляет собой инструментальное средство администрирования баз данных. Утилита ISQL предназначена для осуществления интерактивного доступа к базам данных. В дальнейшем все примеры будут рассматриваться только с применением этих утилит. Поэтому рассмотрим как пользоваться ими. После этого кратко обсудим остальные утилиты.
Cвойства таблиц данных
Свойства полей были рассмотрены в п.п. и . Они распространяются только на отдельные поля. Свойства для совокупности полей задаются, так называемыми, свойствами таблиц. Они включают в себя:
Для задания свойств таблицы в утилите SQL Central следует установить соединение с базой данных Dubl_Biblia. Затем необходимо в левой или правой панели щелкнуть правой клавишей мыши по пиктограмме требуемой таблицы, например таблицы Books. В результате этого на экране появляется контекстное меню (см. рис. 50).

Рис. 50. Контекстное меню установки свойств таблицы данных
Рассмотрим элементы этого меню.
Выбор пункта Open приводит к отображению в правой панели содержимого папки, соответствующей выбранной таблице.
Пункт View Data позволяет просмотреть содержимое таблицы. Воспользоваться этим пунктом могут пользователи с классом полномочий DBA (), владелец таблицы и пользователи, для которых для данной таблицы установлена привилегия SELECT (). Реакцией на выбор пункта View Data является последовательное выполнение следующих действий:
/* Выбор всех полей таблицы */ SELECT * FROM "Stepanov"."Books"
ПРИМЕЧАНИЕ
SQL Anywhere допускает в SQL-операторах использование в названий объектов любых символов. К этим символам относятся пробел, различные специальные символы и символы национальных алфавитов. В таких случаях имена объектов должны быть заключены в двойные кавычки. Если имена объектов состоят только из символов английского алфавита и цифр, то кавычки можно опускать.
Пункт Validate предназначен для запуска утилиты DBVALID (см. табл. - ).
Она осуществляет проверку соответствия:
Применять этот пункт меню могут пользователь с правами администратора базы данных и только на ЭВМ - сервере базы данных.
В утилите ISQL эти действия реализуются следующим SQL-оператором:
/* Проверка индексов и целостности таблицы */ DBTOOL VALIDATE TABLES '"Stepanov"."Books"' USING /*строка соеди- нения () */ 'DBN=Dubl_Biblia;UID=Stepanov; PWD=s;ENG=Server_ste1'
Следующим является пункт меню Unload. Данный пункт могут использовать только пользователи с правами администратора базы данных. Он служит для использования утилиты DBUNLOAD (см. табл. - ). Эта утилита осуществляет выгрузку базы данных. Эта процедура заключается в формировании командного файл и файлов для импорта данных. При этом содержимое таблиц данных записывается в отдельные файлы. Командный файл содержит SQL-операторы, позволяющие создать полную копию базы данных, включая таблицы данных, хранимые процедуры и другие объекты.
Для применения утилиты DBUNLOAD (см. табл. - ) в утилите ISQL необходимо выполнить оператор DBTOOL вида:
//Выгрузка базы данных DBTOOL UNLOAD TABLES TO 'd:\Log_DB\Unload' /* каталог, куда записываются файлы с содержимым таблиц */ RELOAD FILE TO 'd:\Log_DB\Biblia.sql' //полное имя команд- // ного файла USING //строка соединения 'DBN=Biblia;UID=Stepanov; PWD=s; ENG=Server_ste1' //строка соединения ()
Для того, чтобы воспользоваться в дальнейшем результатами работы утилиты DBUNLOAD необходимо выполнить следующую последовательность действий:
/* запуск на исполнение командного файла SQL-операторов */ READ <ПУТЬ>,
где ПУТЬ - полное имя командного файла SQL-операторов.
После этого новая база данных становится точной копией исходной.
Реакцией на пункт меню Edit Columns является запуск редактора структуры таблиц (). Право использовать этот пункт меню имеют владелец таблицы, пользователи с классом полномочий DBA () и пользователи, для которых для работы с таблицей установлена привилегия ALTER().
Выбор пункта Copy позволяет запомнить в системном буфере свойства текущей таблицы с целью копирования их в дальнейшем в другую базу данных. Для этого требуется в текущем сеансе работы утилиты SQL Central осуществить соединение с другой базой данных. Затем для нее отобразить в правой панели содержимое папки Tables. После этого следует щелкнуть в любом свободном месте правой панели правой кнопкой мыши и выбрать в появляющемся контекстном меню пункт Paste. В результате этого на основании данных системного буфера создается копия таблицы первой базы данных.
Следующим пунктом контекстного меню установки свойств таблицы данных является пункт Paste. Применять этот пункт могут только владелец таблицы, пользователи, имеющие для этой таблицы привилегию ALTER () и администратор базы данных. Пункт Paste позволяет добавлять в текущую или другую базу данных копию таблицы, информация о которой была запомнена при выборе пункта Copy рассматриваемого меню.
Посредством выбора пункта Delete осуществляется удаление текущей таблицы из базы данных. Это могут сделать только владелец таблицы или администратор базы данных.
В утилите ISQL для исключение таблицы Stepanov.Books из базы необходимо выполнить следующий оператор:
// Удаление таблицы из базы данных DROP TABLE Stepanov.Books
Последний пункт рассматриваемого меню Properties позволяет проанализировать и модифицировать свойства текущей таблицы. Изменять эти свойства могут только владелец таблицы, пользователи, имеющие для этой таблицы привилегию ALTER ()и администратор базы данных. Другие пользователи могут только просматривать свойства таблицы.
Выбор пункта меню Properties инициирует появление окна Books Properties (рис. 51).

Рис. 51. Окно свойств таблицы Books - вкладка General
Вкладка General позволяет в случае необходимости изменить название таблицы и отредактировать комментарий к таблице. Кроме того она показывает кто является владельцем таблицы и в какой области базы данных хранится текущая таблица ().
В утилите ISQL замена названия таблицы Stepanov.Books на Stepanov.Книги реализуется оператором вида:
//Изменение названия таблицы ALTER TABLE Stepanov.Books RENAME "Книги"
Вкладка Columns предназначена для формирования составного первичного ключа (рис.52).

Рис. 52. Окно свойств таблицы Books - вкладка Columns
ПРИМЕЧАНИЕ
В одной таблице данных может быть определен только один первичный ключ.
В поле вкладки Columns указывается состав первичного ключа. В частном случае, как показано на рис. 52 первичный ключ может состоять из одного поля. Для расширения состава ключа необходимо выделить поля, которые необходимо ввести в состав ключа. Выделение нескольких полей осуществляется щелком левой клавиши мыши при нажатой клавиши Ctrl. После этого необходимо щелкнуть по кнопке Add To Key. При этом состав первичного ключа будет отображен в поле внизу вкладки. Если затем "нажать" на одну из кнопок OK или Применить, то состав первичного ключа будет зафиксирован в базе данных. Отличие состоит в том, что при использовании кнопки OK окно Books Properties закроется. При щелчке мышью по кнопке Применить это окно останется на экране и пользователь может продолжить модификацию первичного ключа.
Включение в таблице Books в состав первичного ключа полей City_publish и Publisher в дополнение к ключевому полю Code_book в утилите ISQL осуществляется операторами:
// удаление первичного ключа ALTER TABLE Stepanov.Books DELETE PRIMARY KEY; //формирование составного первичного ключа ALTER TABLE Stepanov.Books ADD PRIMARY KEY (Code_book,City_publish,"Publisher")
Элементы управления вкладки Columns позволяют также исключать поля из первичного ключа. Для следует выделить исключаемые поля и воспользоваться кнопкой Remote From Key. Измененный состав ключа опять отобразиться в нижнем поле вкладки. Для удаления всего первичного ключа таблицы можно применить кнопку Remote All.
Все эти действия в ISQL реализуются совокупностью двух SQL-операторов, приведенных выше.
Кнопка Details вкладки Columns позволяет просмотреть все свойства выделенного поля. В утилите ISQL эту информацию можно получить, применив оператор SELECT к системному представлению SYS.SYSCOLUMNS.
Задание признака уникальности и наложение условия для значений совокупности полей осуществляется во вкладке Constraints (рис. 53).

Рис. 53. Окно свойств таблицы Books - вкладка Constraints
ПРИМЕЧАНИЕ
В одной таблице данных может быть определено несколько групп полей с признаками уникальности значений. В каждой такой группе совокупность значений составляющих ее полей должна быть уникальной.
В поле области Uniqueness Constraints данной вкладки отображаются группы полей таблицы с признаками уникальности значений. Для таблицы Books уникальность значений установлена только для одной группы. Она состоит из одного поля Code_book и была автоматически сформирована при определении этого поля первичным ключом таблицы. Для формирования новой группы следует воспользоваться кнопкой New. При этом открывается окно Add Uniqueness Constraint. Оно имеет точно такой же вид как и вкладка Columns ().
В утилите ISQL для добавления/удаления совокупности полей с признаком уникальности необходимо выполнить SQL-операторы вида:
/* Добавления новой совокупности полей с признаком уникальности /* ALTER TABLE Stepanov.Books ADD UNIQUE(City_publish,"Publisher"); /* Удаление совокупности полей с признаком уникальности /* ALTER TABLE Stepanov.Books DELETE UNIQUE(City_publish, "Publisher")
Поле области Check Constraint вкладки Constraints предназначено для задания условия накладываемые на значения таблицы. В утилите ISQL эти действия реализуются следующими операторами:
/* Установка условий для значений таблицы */ ALTER TABLE Stepanov.Books ADD CHECK(Number>0 AND Start_date>=1992); /* Снятие условий для значений таблицы */ ALTER TABLE Stepanov.Books DELETE CHECK
Назначение вкладки Permissions (рис. 54) состоит в установлении для пользователей привилегий по манипулированию текущей таблицей.

Рис. 54. Окно свойств таблицы Books - вкладка Permissions
На вкладке Permissions показано, что пользователь Sidorova имеет привилегию SELECT () для таблицы Books (). Причем он(она) имеет право предоставлять эту привилегию другим пользователям. Такие привилегии данному пользователю предварительно установил автор. Для предоставлении привилегий другим пользователям следует щелкнуть мышью по кнопке Grant.

Рис. 55. Назначение пользователей, допущенных к работе с таблицей Books
После этого необходимо выделить из предлагаемого списка требуемых отдельных пользователей или/и групп пользователей. Этим самым реализуется назначение индивидуальных или групповых привилегий. На рис. 55 показано выделение пользователей Ivanova, Popova и группы пользователей LIBRARIANS. После этого следует щелкнуть по кнопке Grant Permission. Результат допуска этих пользователей будет отображен в вкладке Permissions (рис. 56).

Рис. 56. Пользователи допущенные к работе с таблицей Books и перечень их привилегий
По умолчанию каждому пользователю назначаются все привилегии без права из передачи другим пользователям. Для коррекции привилегий отдельного пользователя следует выделить его как показано на рис. 56. В результате этого становятся доступными группы флажков Permission и Grant option. Установка/снятие флажков в первой группе соответствует назначению/отмене соответствующих привилегий. На рис. 56 показано, что какие привилегии устанавливаются пользователю Petrova. Этому пользователю назначены все привилегии кроме привилегии DELETE (). Привилегия UPDATE () позволяет пользователю Petrova модифицировать только поля Number и Times_read. Уточнение привилегий для подмножества полей таблицы осуществляется при помощи кнопок с многоточием. Кроме того, пользователь Petrova имеет право назначать привилегию SELECT () для таблицы Books другим пользователям. Следует отметить, в закладке Permissions (см. рис. 56) можно устанавливать как индивидуальные, так и групповые привилегии. Так на рис. 56 видно, что индивидуальные привилегии установлены для пользователей Petrova, Ivanova и Sidorova. Групповые привилегии определены для группы пользователей LIBRARIANS. Из этого следует, что для всех членов этой группы (пользователей Petrova, Ivanova, Sidorova и Popova) определена привилегия INSERT () для работы с таблицей Stepanov.Books. Таким образом, установка данной привилегий для пользователей Petrova и Ivanova является избыточной.
Все действия, произведенные в SQL Central при рассмотрении вкладки Permissions, можно произвести и в утилите .ISQL Для этого следует выполнить последовательность ниже приведенных SQL-операторов:
/* Установление привилегии SELECT для пользователя Sidorova, с правом ее передачи другим пользователям */ GRANT SELECT ON Stepanov.Books TO Sidorova WITH GRANT OPTION; /* Установление всех привилегий для пользователя Ivanova */ GRANT ALL PRIVILEGES ON Stepanov.Books TO Ivanova; /* Установление трех привилегий для пользователя Petrova */ GRANT ALTER, INSERT, INDEX ON Stepanov.Books TO Petrova; /* Установление привилегии SELECT для пользователя Petrova, с правом ее передачи другим пользователям */ GRANT SELECT ON Stepanov.Books TO Petrova WITH GRANT OPTION; /* Установление для пользователя Petrova привилегии UPDATE для полей Number и Times_read */ GRANT UPDATE(Number,Times_read) ON Stepanov.Books TO Petrova; /* Установление привилегии INSERT для группы пользователей LIBRARIANS */ GRANT INSERT ON Stepanov.Books TO LIBRARIANS
Последней вкладкой окна свойств таблицы данных () является вкладка Statistics. Она представлена на рис. 57.

Рис. 57. Окно свойств таблицы Books - вкладка Statistics
Вкладка Statistics показывает некоторые физические характеристики текущей таблицы. В поле Number of columns показано количество полей таблицы. Таблица Books состоит из 10 полей. Поле Approximate number of rows отображает примерное число записей таблицы. Таблица Books пока не содержит ни одной записи. В поле Maximum table width указывается максимальная длина записи в байтах. При этом размеры полей с перемененной длинной (см.табл. , ) не учитываются.
В утилите ISQL количество полей таблицы можно определить путем просмотра из перечня (см. рис. , ). Количество записей в таблице можно определить при выполнении оператора SELECT. Оно отображается при этом в окне Statistics утилиты ISQL.
Таким образом, совместно со свойствами полей, свойства таблицы представляют пользователям возможность хранить в базах данных информацию с широким спектром характеристик.
Дополнительные свойства полей
В SYBASE SQL Anywhere создание таблиц осуществляется оператором Create Table. Согласно синтаксиса этого оператора для каждой таблицы можно определить свойства для всей таблицы, а также основные и дополнительные свойства полей.
К основным свойствам полей относятся:
Дополнительные свойства полей включают:
Некоторые свойства полей были рассмотрены в , остальные - будут рассмотрены ниже. Свойства таблиц будут предметом рассмотрения .
В утилите SQL Central разработчики вынесли в окна редактора структуры таблиц наиболее часто используемые свойства полей (). Доступ к остальным свойствам осуществляется через меню или панель инструментов редактора. Другим способом установить вышеуказанные свойства можно, используя контекстные меню полей и таблиц. Эти меню появляются после щелчка правой кнопкой мыши по соответствующему полю или таблице. В утилите ISQL определение свойств таблиц и ее полей осуществляется при помощи SQL-операторов Create Table и Alter Table. Установим дополнительные свойства полей в таблице Books базы данных Dubl_Biblia.
Как было показано в , эта таблица была создана путем копирования ее структуры из исходной таблицы . В создаваемую таким образом таблицу дополнительные свойства полей и свойства таблицы из исходной не переписываются. В связи с этим данные свойства необходимо установить принудительно. В таблице Books следует определить поле Code_book первичным ключом и показать как устанавливаются значения, присваиваемые этому полю по умолчанию. Для этого воспользуемся контекстным меню.
ПРИМЕЧАНИЕ
Изменять свойства полей таблицы имеют возможность ее владелец, пользователи с классом полномочий DBA и пользователи, для которых для работы с таблицей установлена привилегия ALTER ().
Подключитесь к базе данных Dubl_Biblia в утилите SQL Central для установления дополнительных свойств полей таблицы Books. Отобразите в правой панели перечень ее полей. Последовательно раскройте содержимое папок Tables, Books и Columns. Выделите поле Code_book и щелкните по нему правой кнопкой мыши. В результате этого появится контекстное меню (рис. 45).

Рис. 45. Контекстное меню установки свойств поля таблицы данных
Последовательно рассмотрим пункты данного меню.
Выбор первого пункта этого меню Add Primary Key позволяет установить признак ключевого поля, т.е. признак вхождения поля в состав первичного ключа. Если для поля этот признак уже установлен, то данный пункт меню имеет название Remote from Primary Key. Выбор рассматриваемого меню в этом случае приводит к снятию признака первичного ключа.
В утилите ISQL для определения поля Code_book в качестве первичного ключа необходимо выполнить следующий оператор:
/* Изменение свойств таблицы */ ALTER TABLE Stepanov.Books ADD PRIMARY KEY (Code_book)
Удаление из таблицы признака первичного ключа осуществляется оператором вида:
/* Удаление первичного ключа таблицы */ ALTER TABLE Stepanov.Books DELETE PRIMARY KEY
Следующим пунктом контекстного меню свойств поля является пункт Advanced Properties. Посредством этого пункта осуществляется установка некоторых дополнительных свойств поля. В случае выбора данного пункта на экран выводится окно Advanced Column Properties (рис. 46).

Рис. 46. Окно дополнительных свойств поля таблицы данных
В этом окне можно определить значения, присваиваемое полю по умолчанию. Речь идет о значениях полей новых записей. Новые записи добавляются в таблицы при выполнении SQL-оператора INSERT. В этом операторе для каждой новой записи указывается перечень инициализируемых полей и их значений. Полям, отсутствующих в этом перечне, присваиваются значения, определенные по умолчанию. Если значение по умолчанию не установлено, то в поле записывается значение NULL.
В SYBASE SQL Anywhere пользователям предоставляется возможность устанавливать произвольные значения полей по умолчанию в виде :
Кроме произвольных значений по умолчанию, в качестве таковых могут использоваться служебные значения. К ним относятся:
Рассмотрим AUTOINCREMENT подробнее. В поле A с таким значением по умолчанию всегда записывается число на единицу превышающее текущий максимум M. М содержит максимальное значение среди всех ранее введенных в поле A, в том числе и уже удаленных записей. Если для поля A в операторе INSERT (добавляет новую запись) указано конкретное значение N, то:
Динамика изменения значений поля A представлена на рис. 47.

Рис. 47. Динамика изменений значения поля А, для которого по умолчанию определена установка AUTOINCREMENT:
а)исходное состояние таблицы;
б)таблица после добавления новой записи, значение N не задано;
в)таблица после добавления новой записи, N =10;
г)таблица после удаления двух последних записей;
д)таблица после добавления новой записи, N =4;
е)таблица после добавления новой записи, значение N не задано.
В окне Advanced Column Properties () задание значений, присваиваемых по умолчаний, осуществляется в области Default value. Состояние переключателя этой области в положении User-defined позволяет устанавливать в поле, находящемся справа от него, значения по умолчанию в виде строк, чисел или константных выражений. Если для этой цели требуется использовать служебные значения по умолчанию, то тогда следует установить переключатель в состояние Pre-defined. При этом станет доступным список, из которого можно сделать необходимый выбор.
В области Constraints можно установить такие свойства полей как:
Реализация этих действий в утилите ISQL иллюстрируется следующими SQL-операторами, изменяющих свойства поля Books.Year_publish:
/* Установка признака уникальности значений поля */ ALTER TABLE Stepanov.Books ADD UNIQUE(Year_publish); /* Снятие признака уникальности значений поля */ ALTER TABLE Stepanov.Books DELETE UNIQUE(Year_publish); /* Установка признака разрешения хранения значения NULL */ ALTER TABLE Stepanov.Books MODIFY Year_publish NULL; /* Снятие признака разрешения хранения значения NULL */ ALTER TABLE Stepanov.Books MODIFY Year_publish NOT NULL; /* определение условия для значений поля */ ALTER TABLE Stepanov.Books MODIFY Year_publish CHECK(Year_publish>1992); /* Снятие условия для значений поля */ ALTER TABLE Stepanov.Books MODIFY Year_publish CHECK NULL
Следующим пунктом контекстного меню свойств поля таблицы данных () является пункт Copy. Его выбор позволяет запомнить в буфере основные свойства поля для последующего копировать описания поля в другую таблицу. Для использования информации из буфера следует выделить необходимую таблицу в левой панели утилиты и вызвать правой кнопкой мыши контекстное меню. Выбор в нем пункта Paste позволяет добавить в эту таблицу новое поле с основными свойствами исходного. Например, таким образом можно переместить поле Books.Title_book в таблицу Copies.
В утилите ISQL это действие осуществляется выполнением следующего SQL-оператора:
//Введение нового поля в таблицу ALTER TABLE Stepanov.Copies ADD Title_book // имя нового поля LONG VARCHAR NOT NULL //свойства поля
Пункт меню контекстного меню свойств поля Delete позволяет удалить поле из таблицы данных.
В ISQL это действие реализуется следующим SQL-оператором:
/* Исключение поля Code_book из таблицы Stepanov.Books */ ALTER TABLE Stepanov.Books DELETE Code_book
Пункт Properties этого меню позволяет проанализировать и отредактировать все свойства поля таблицы данных. Реакцией на его выбор в нашем случае является появление окна Code_book Properties (рис. 48).

Рис. 48. Окно свойств поля Code_book - вкладка General
Вкладка General этого окна позволяет изменить название поля и при необходимости сделать краткий комментарий о назначении поля.
Для модификации названия поля в утилите ISQL необходимо выполнить следующий SQL-оператор:
/* Изменение в таблице Books названия поля "Code_book" на "Code_b" */ ALTER TABLE Stepanov.Books RENAME Code_book TO Code_b
Вкладка Data Type этого окна (рис. 49) предназначена для изменения типа данных поля.

Рис. 49. Окно свойств поля Code_book - вкладка Data Type
Для поля входящего в состав первичного или составного ключа изменить тип данных поля невозможно. Этот момент представлен на рис. 49, список Data type не доступен.
Другой функцией вкладки Data Type является анализ таких свойств поля как признак разрешения хранения значений NULL, значение, присваиваемое полю по умолчанию, признак уникальности значений поля и условие, накладываемое на значения поля. Для изменения этих свойств необходимо щелкнуть мышью по кнопке Edit. В этом случае на экране появляется окно Advanced Column Properties (), которое было рассмотрено выше.
В утилите ISQL также имеется возможность изменения типов полей и проанализировать свойства полей. Информация об этих свойствах может быть получена при помощи SQL-оператора SELECT из системного представления SYS.SYSCOLUMNS. Изменение типов данных полей реализуется оператором ALTER TABLE. Для изменения в поле Books.Number типа данных Smallint на Integer следует воспользоваться оператором вида:
/* Изменение типа данных поля /* ALTER TABLE Stepanov.Books MODIFY Number INTEGER
Таким образом, используя контекстное меню свойств поля можно проанализировать его свойства, а при необходимости и отредактировать их.
Определение таблиц данных
Таблицы данных являются, как правило, самыми первыми объектами создаваемых в базах данных. Рассмотрим как решается эта задача в СУБД SYBASE SQL Anywhere, на примере создания в базе данных Dubl_Biblia копий двух таблиц . Речь идет о таблицах Copies (характеристики экземпляров книг) и Books (данные о книгах, имеющиеся в библиотеке). При этом в учебных целях установим для поля Copies.Code_book тип данных Char(10). Следует напомнить, что создание любых объектов базы данных могут осуществлять только пользователи, имеющие класс полномочий RESOURCE или DBA.
Как и ранее, начнем с применения SQL Central. После запуска этой утилиты осуществим соединение с базой данных Dubl_Biblia под именем администратора базы данных Stepanov. Затем воспользуемся редактором структуры таблиц. Его можно запустить через элемент Add Table, который находится в папке Tables. Редактор структуры таблиц выводит на экран окно Table

Рис.42. Окно редактора структуры таблиц
ПРИМЕЧАНИЕ
Редактор структуры таблиц, но с названием таблицы вместо фразы
Как видно из окно редактора содержит таблицу, в ячейки которых вводятся свойства полей. Каждому полю создаваемой таблицы данных соответствует одна строка. Назначение колонок таблицы рассматриваемого редактора приводится ниже.
В колонке Key указывается признак ключевого поля, означающий что это поле входит в состав первичного ключа таблицы. На показано, что первичный ключ таблицы состоит только из одного поля N_books. Установка/снятие признака ключевого поля осуществляется щелчком левой кнопки мыши.
Колонка Column Name содержит название полей таблицы данных.
ПРИМЕЧАНИЕ
В названиях полей таблицы допустимо использовать любые символы, в том числе и пробелы, и буквы неанглийского алфавита. В дальнейшем в SQL-операторах при обращении к таким полям их следует заключать в двойные кавычки.
Колонка Data Type служит для определения типов данных полей создаваемой таблицы. Задание типа данных осуществляется выбором из списка, в виде которого эта колонка представлена в каждой строке.
Колонка Size/Prec. предназначена для задания размера для типов данных Char и его синонимов, Decimal, Numeric и Binary. Если в колонке Data Type задан один из этих типов, то колонка Size/Prec. представляется в виде счетчика. Щелкая мышью по стрелкам счетчика, можно установить требуемый размер поля таблицы данных. Как видно на , таким образом задан размер в 10 байтов для поля Code_book.
Для типов данных Decimal и Numeric, помимо переменного общего размера, требуется указать еще и точность дробной части представляемых значений. Для этого используется колонка Scale. В необходимых случаях она, как и колонка Size/Prec, представляется в виде счетчика.
Важное значение имеет колонка Allow Nulls. Оно указывает может ли текущее поле создаваемой таблицы содержать специальное значение NULL. Это значение указывает на то, что в поле не содержатся данные. Оно помогает определить были ли ранее в это поле введены данные. Как видно на , для всех полей таблицы Copies не разрешено хранение значения NULL.
В колонку Comment записывается комментарий к полям таблицы данных.
Таблица со свойствами полей создаваемой таблицы данных является основным элементом окна редактора свойств таблицы, но не единственным. Поле Name предназначено для ввода имени таблицы. Поле Creator предназначено для выбора владельца создаваемой таблицы. Такая возможность предоставлена только для пользователей с правами администратора. В базе данных Dubl_Biblia - это пользователи dba и Stepanov. Такие пользователи могут создавать объекты базы данных от имени других пользователей. Эта возможность для таблиц реализуется при помощи поля Creator в окне редактора свойств таблицы. .Новые объекты могут создавать также пользователи с классом полномочий Resource. Однако пользователи данной категории могут создавать эти объекты только от своего имени.
Управление работой редактора структуры таблиц осуществляется при помощи меню. Оно появляется после щелка правой кнопки мыши в любом месте окна редактора ниже таблицы свойств полей таблицы данных. Такое меню приведено на . Оно содержит следующие пункты:
Действия, реализуемые пунктами меню редактора, можно выполнить при помощи панели инструментов. Она расположена в верхнем правом углу окна редактора ().
Введем всю информацию для определения свойств полей таблицы Copies как показано на . После этого завершим работу в редакторе структуры таблиц. В результате этого в базе данных Dubl_Biblia появится новая и пока единственная таблица Copies. Этот факт будет представлен вложенной папкой Copies в папке Tables. Самостоятельно раскройте данную папку и проверьте это утверждение. Обратите внимание, что владельцем созданной таблицы является пользователь Stepanov.
Для того, чтобы создать таблицу Copies в утилите ISQL необходимо выполнить следующую последовательность SQL-операторов:
//Создание таблицы CREATE TABLE Stepanov.Copies /* Имя владельца может указывать только администратор базы данных */ ( N_books SMALLINT NOT NULL, /* Тип поля SMALLINT, значения NULL не допустимы */ Code_book SMALLINT NOT NULL, Present BIT NOT NULL, /* Тип поля BIT */ PRIMARY KEY(N_books), /* Ключ таблицы состоит из одного поля */ ); /* Комментарии к полям таблицы */ COMMENT ON COLUMN Stepanov.Copies.N_books IS 'Инвентарный N экземпляра книги'; COMMENT ON COLUMN Stepanov.Copies.Code_book IS 'Шифр (код) наименования книги'; COMMENT ON COLUMN Stepanov.Copies.Present IS ' Признак наличия данного экземпляра книги '
Убедиться в том, что в базе данных появилась новая таблица можно, просмотрев список имеющихся в базе таблиц и представлений (см. рис. - ).
Теперь создадим в базе данных Dubl_Biblia копию таблицы Books . Она содержит много полей (). В утилите SQL Sentral имеется возможность не устанавливать большинство их свойства вручную. Это реализуется копированием структуру таблицы Books из .
В текущий момент в утилите SQL Sentral установлено соединение к базе данных Dubl_Biblia. Подключимся еще и к . Раскроем в правой панели папку Tables этой базы данных. Затем выделим в правой панели папку Books, соответствующий таблице Books. После этого перетащим ее в папку Tables базы данных Dubl_Biblia. При перетаскивании курсор Books принимает сложную форму. Вид курсора, установленный при этом на папку Tables базы данных Dubl_Biblia в левой панели утилиты, и содержимое главного окна утилиты SQL Central на этот момент времени приведен на рис. 43.

Рис.43. Копирование структуры таблицы данных Books
При копировании таким образом утилита запрашивает у пользователя подтверждение копирования структуры таблицы (рис. 44).

Рис.44. Подтверждение копирование структуры таблицы данных Books
В результате проведенных действий в базе данных Dubl_Biblia появилась таблица Books. Чтобы убедиться в этом раскройте ее папку Tables.
При дублировании таким образом в новую базу переписывается структура исходной таблицы. Но при этом следует отметить, что созданная таблица содержит только основные свойства ее полей. Речь идет о названиях, типах и размерах полей, а также о разрешении хранения значений NULL и признаке уникальности значений полей. Дополнительные свойства в этом случае должны устанавливаться заново. Свойства полей и таблиц рассмотрены в и .
В утилите ISQL создание копии таблицы Books производится только оператором Create Table. Для того, чтобы получить такой же результат, что и в утилите SQL Central необходимо выполнить этот оператор следующими параметрами:
CREATE TABLE Books ( Code_book SMALLINT /* Уникальное поле типа SMALLINT.*/ NOT NULL /* Значения NULL запрещены */ DEFAULT //Значения по умолчанию автома- AUTOINCREMENT UNIQUE, /*тически- увеличиваются на единицу */ .
Author LONG VARCHAR NULL, /* Поле типа LONG VARCHAR. Значения NULL разрешены. */ Coauthors LONG VARCHAR NULL, Title_book LONG VARCHAR NULL, City_publish CHAR(15) NOT NULL, "Publisher" /* Название поля в кавычках потому что имеется одноименное служебное слово в языке Watcom-SQL */ CHAR(20) NOT NULL, Year_publish SMALLINT NOT NULL, Number SMALLINT NOT NULL, Start_date DATE NOT NULL, Times_read SMALLINT NOT NULL )
Определение внешних ключей
Внешние ключи используются для организации связей между таблицами базы данных (родительскими и дочерними) и для поддержания ограничений ссылочной целостности данных. В СУБД SYBASE SQL Anywhere ссылочная целостность проверяется при:
Основная цель ссылочной целостности заключается в недопустимости наличия "висячих" ссылок из дочерних таблиц на родительскую таблицу.
Для проверки действия механизма внешних ключей перепишем содержимое таблиц Books и Copies в одноименные таблицы базы данных Dubl_Biblia. Такая возможность довольно просто реализуется в утилите ISQL. Для решения поставленной задачи необходимо в среде этой утилиты установить соединение с и произвести экспорт содержимого таблиц в текстовые файлы. Это могут сделать владельцы таблиц, пользователи, имеющие привилегию SELECT () для этих таблиц, и администратор базы данных.
Экспорт в данном случае реализуется следующими операторами:
/* Экспорт в текстовые файлы каталога C:\temp содержимого таблиц Books и Copies */ UNLOAD TABLE Stepanov.Books TO 'c:\temp\books.txt'; UNLOAD TABLE Stepanov.Copies TO 'c:\temp\copies.txt'
После этого следует опять же в утилите ISQL подключиться к базе данных Dubl_Biblia. При этом отсоединение от произойдет автоматически. Теперь требуется выполнить операторы, осуществляются импорт данных:
/* Импорт из текстовых файлов содержимого таблиц Books и Copies */ LOAD TABLE Stepanov.Copies FROM 'c:\temp\copies.txt'; LOAD TABLE Stepanov.Books FROM 'c:\temp\books.txt'
Выполнять операторы LOAD имеют право владельцы таблиц, пользователи, имеющие привилегию INSERT () для этих таблиц, и администратор базы данных.
Для проверки результатов копирования достаточно просмотреть содержимое таблиц при помощи оператора SELECT ().
Внешние ключи могут создавать:
В утилите SQL Central внешние ключи создаются мастером Add Foreign Key. Для доступа к нему следует последовательно раскрыть папки Tables - <имя таблицы> - Foreign Keys. Мастер Add Foreign Key выполняет ряд шагов, которые мы рассмотрим по устоявшейся схеме (п.5.1). Работу мастера покажем на примере создания внешнего ключа таблицы Copies, который ссылается на таблицу Books.
Шаг 1. Начальная стадия создания внешнего ключа таблицы данных (рис. 63).

Рис. 63. Создание внешнего ключа таблицы данных
Пояснение. Добро пожаловать в Мастер создания внешних ключей. Этот Мастер позволяет вам создать ссылку на другую таблицу данных.
Внешние ключи, создаваемые пользователями СУБД SQL Anywhere, обеспечивают поддержание ссылочной целостности баз данных.
Дочерняя таблица: Copies.
Вопрос. На какую таблицу будет ссылаться создаваемый внешний ключ?
Ниже следует список, в котором следует произвести указать родительскую таблицу. Создаваемый внешний ключ должен ссылаться на таблицу Books и ее мы выбираем в качестве родительской таблицы.
После выбора родительской таблицы следует щелкнуть по кнопке Далее для выполнения следующего шага.
Шаг 2. Выбор полей родительской таблицы, на которые будет ссылаться внешний ключ дочерней таблицы данных (рис. 64).

Рис. 64. Выбор полей родительской таблицы, на которые будет ссылаться внешний ключ дочерней таблицы данных
Вопрос 1. Создаваемый внешний ключ будет указывать на первичный ключ или совокупность полей с признаком уникальности?
Ниже следует список, предлагающий путем выбора одной из альтернатив ответить на этот вопрос. В нашем случае внешний ключ должен содержать ссылку на первичный ключ.
Содержание вопроса 1связано с тем, что внешний ключ должен обязательно ссылаться или на первичный ключ или на одну из совокупностей полей с признаком уникальности.
Вопрос 2. Какие поля внешнего ключа будут соответствовать полям первичного ключа родительской таблицы?
Далее приводится таблица соответствия полей. SQL Anywhere пытается сама установить соответствие по совпадению имен и типов полей. В тех случаях, где она затрудняется это сделать предлагается список для осуществления выбора. В нашем случае соответствие установлено правильно.
Если предлагаемое соответствие вас устраивает, то переходим к очередному шагу.
Шаг 3. Определение названия и комментария к внешнему ключу (рис. 65).

Рис. 65. Определение названия и комментария к внешнему ключу
Вопрос. Какое название будет иметь новый внешний ключ?
Следующее ниже поле окна представляет собой средство для ответа на поставленный вопрос. Назовем внешний ключ Books_Copies.
Пояснение. Вы можете включить комментарий для нового внешнего ключа.
Ниже располагается поле для ввода комментария для создаваемого внешнего ключа.
Произведя все манипуляции, приступаем к следующему шагу.
Шаг 4. Задание атрибутов внешнего ключа (рис. 66).

Рис. 66. Задание атрибутов внешнего ключа
Пояснение 1. SQL Anywhere позволяет внешнему ключу содержать значения NULL.
Вопрос 1. Желаете ли вы разрешить хранение значений NULL в полях, составляющих внешний ключ?
Для ответа на этот вопрос предназначен флажок Allows NULLS. В тех случаях, когда это недопустимо, например как в нашем, ниже в области Note приводится комментарий по этому поводу.
Комментарий. Ни одно из полей, составляющих внешний ключ, не допускают хранение значений NULL.
Пояснение 2. SQL Anywhere может отложить проверку ссылочной целостности с использованием этого внешнего ключа до выполнения оператора COMMIT вместо того, чтобы производить проверку целостности сразу после изменения содержимого таблицы данных.
Вопрос 2. Желаете ли вы производить проверку целостности только при выполнении оператора COMMIT?
Флажок Check on COMMIT позволяет ответить на этот вопрос.
Оператор COMMIT осуществляет завершение текущей и начало следующей транзакций. В некоторых случаях необходимо при выполнения последовательности SQL-операторов, изменяющих сразу несколько таблиц, выполнять проверку целостности только при завершении транзакций. SQL Anywhere предоставляет такую возможность и именно этим вызван вопрос 2.
В нашем случае нет необходимости откладывать проверку ограничений целостности и поэтому оставим флажок Check on COMMIT в сброшенном состоянии.
После выполнения действий, предписанных в шаге 4, переходим шагу 5.
Шаг 5. Определение условий ссылочной целостности (рис. 67).

Рис. 67. Определение условий ссылочной целостности
Вопрос 1. Какие действия должны предприниматься для поддержания ссылочной целостности?
Для ответа на этот вопрос используются переключатели Update Action и Delete Action. Первый из них, Update Action, определяет действие, выполняемое при модификации значений полей родительской таблицы, на которые ссылаются поля внешнего ключа дочерней таблицы. Назовем эти поля родительской таблицы адресуемыми полями. Второй переключатель Delete Action предназначен для выбора действия, выполняемого при удалении записей родительской таблицы.
Положения переключателя Update Action. регламентируют выполнение следующих действий при модификации адресуемых полей родительской таблицы:
Для указания действий, которые надлежит выполнить при удалении записей родительской таблицы используется переключатель Delete Action. Он следующие положения:
Как показано на рис. 67 для создаваемого внешнего ключа определено каскадное обновление полей внешнего ключа дочерней таблицы (поле Copies.Code_book) при изменение адресуемых полей родительской таблицы (поле Books.Code_book) - (Update Action/ Cascade) и запрещение удаления записей родительской таблицы Books, на которую имеются ссылки из дочерей таблицы Copies. (Delete Action / Restrict Delete).
После определения условий ссылочной целостности приступаем к заключительному шагу.
Шаг 6. Подтверждение готовности к созданию нового внешнего ключа (рис. 68).

Рис. 68. Подтверждение готовности к созданию нового внешнего ключа
Регистрация пользователей
Каждый пользователь, который намеревается манипулировать с соответствующей базой данных, должен пройти процедуру регистрации. Это связано с обеспечением защиты от несанкционированного доступа. Так как этот вопрос играет важную роль в технологии клиент/сервер, именно с него начнем рассмотрение вопроса создания объектов в базах данных.
Регистрация пользователей позволяет установить для каждого из них индивидуальные привилегии по манипулированию с объектами базы данных. Разработчики SYBASE SQL Anywhere рекомендуют регистрировать каждого пользователя. Накладные расходы, связанные с администрирование небольшие и кроме того, это создает дополнительные возможности по контроля за работой баз данных. Это проявляется в том, что:
В процессе проведения регистрации конкретному пользователю присваивается уникальное имя пользователя, которому ставится в соответствие секретное слово - пароль. При этом также устанавливаются классы полномочий, которыми будет обладать данный пользователь. СУБД SYBASE SQL Anywhere поддерживает три класса полномочий:
Рассмотрим технологию регистрации индивидуальных пользователей и групп пользователей.
Кроме класса полномочий, пользователи имеют еще и привилегии по манипулированию объектами баз данных. Для пользователя могут быть не определен ни один из классов полномочий, но привилегиями (индивидуальными или групповыми) должен обладать любой пользователь. В противном случае его регистрации в базе данных лишена всякого смыла, т. к. он тогда ничего не сможет сделать.
Пользователь, создавший какой-либо объект базы данных, является его полномочным владельцем. Он имеет неограниченные привилегии по манипулированию своими объектами. Владелец может удалить объект, предоставить доступ к нему другим пользователям и т.д.
ПРИМЕЧАНИЕ
В СУБД SYBASE SQL Anywhere привилегии по манипулированию объектами могут предоставляться пользователями - владельцами объектов и пользователями с классом полномочий DBA. Классы полномочий предоставляются только пользователями с правами администратора базы данных.
В СУБД SYBASE SQL Anywhere реализованы привилегии для таблиц данных, представлений и для хранимых процедур и функций. Привилегии таблиц представлены в (табл. 7).
Создание базы данных и определение ее объектов
Одним из важных этапов жизненного цикла любой базы данных является ее создание и определение ее объектов. Для решения этих задач пользователям SYBASE SQL Anywhere предоставляется удобное средство - утилита SQL Central. Вопросам ее применения и посвящается предлагаемая глава. Однако преимуществами данной утилиты могут воспользоваться не все пользователи. Такая возможность предоставляется только тем из них, кто использует SQL Anywhere в операционных системах Windows 3.x, Windows 95 или Windows NT. Однако некоторые пользователи применяют версии SQL Anywhere, разработанные под операционные системы OS\2, QNX, AIX, NetWare и другие. Для такой категории пользователей в данной и последующих главах показано как возможности утилиты SQL Central можно реализовать в доступной им утилите ISQL.
В данной и последующих главах, посвященных SYBASE SQL Anywhere, широко применяются SQL-операторы. В дальнейшем SQL-операторы часто будем называть просто операторами, если не требуется явного указания, что они имеют отношение к языку SQL. Все примеры операторов содержат комментарии, которые, согласно синтаксиса языка, начинаются с двух символов "//" для комментариев в одну строку или заключены в символы "/*" и "*/" для многострочных комментариев. Текст комментария может быть вставлен в тело оператора. Служебные слова операторов будут представляться только заглавными буквами, а остальные - прописными. Ниже приводится простой пример SQL-оператора:
//Пример SQL-оператора SELECT /* это служебное слово, обозна- чающее название оператора */ Code_book, .Author /* список полей оператора SELECT */ FROM Stepanov.Books /*данные выбираются из таблицы Books, владельцем которой является пользователь Stepanov */
Как видно из примера, элементы операторов представлены более крупным шрифтом по сравнением с комментариями, чтобы за деревьями не просмотреть леса. Это искусственный прием. В приложениях все будет представляться одним шрифтом. Правда в тестовых редакторах некоторых приложений, например SQL Central, служебные слова выделяются другим цветом.
Создание базы данных
Создание базы производится посредством утилиты DBINIT (см. табл. - ). Покажем, как она используется в SQL Central.
ПРИМЕЧАНИЕ
Действия по созданию новой базы данных можно производить только на ЭВМ-сервере баз данных. На клиентской ЭВМ эти действия выполнить невозможно.
После запуска SQL Central на ЭВМ-сервере баз данных раскройте папку Utilities и выберите мастер Create Database (рис. 25).

Рис.25. Выбор мастера Create Database для создания базы данных
После запуска мастера Create Database вам будет предложено выполнить ряд шагов. Каждый шаг представляется в виде отдельного окна. Заголовок, как правило, но совсем не обязательно, имеет название выполняемого шага. В верхней части окна обычно следует пояснение выполняемого шага. Ниже следует вопрос с предлагаемыми альтернативами. Именно в такой последовательности будем рассматривать шаги, который предлагает выполнить мастер Create Database. По этой же схеме будем обсуждать действия, выполняемые другими мастерами.
Шаг 1. Начальная стадия создание базы данных (рис. 26).

Рис.26. Создание базового файла базы данных
Пояснение. Добро пожаловать в Мастер создания баз данных. Этот Мастер позволяет вам создать файл для хранения базы данных СУБД SQL Anywhere.
Вопрос. В каком каталоге и какое имя файла вы хотите использовать для хранения новой базы данных?
Ниже следует поле, в которое необходимо ввести полное имя файла. Это имя можно также выбрать при помощи кнопки Browse. Назовем создаваемую базу данных Dubl_Biblia. Поместим ее в тот же каталог (папку), что и . Как было сказано в , на ЭВМ-сервере размещается в каталоге с:\database. После заполнения поля окна щелкните мышью по кнопке Далее для выполнения следующего шага.
Шаг 2. Выбор параметров журнала изменений базы данных (рис. 27).

Рис.27. Выбор параметров журнала изменений базы данных
Пояснение. Если вы выберете режим использования журнала изменений базы данных (transaction log), то вы можете поместить его в отдельном каталоге (по умолчанию журнал размещается в том же каталоге, что и базовый файл базы данных).
Вопрос. Будете ли вы использовать журнала изменений базы данных?
Нахождение переключателя в состоянии No transaction log является отрицательным ответом на поставленный вопрос. Если переключатель установлен в положение Maintain a log file in this path and file , то означает, что база данных будет использовать журнал изменений. При этом в единственном поле окна предлагается имя файла, в котором будет храниться журнал. Оно может быть изменено вручную или при помощи кнопки Browse.
В целях повышения надежности хранения и восстановления базы данных целесообразно размещать журнал изменений на другом жестком диске сервера или другой ЭВМ вычислительной сети.
После проведенных манипуляций переходим к очередному шагу.
Шаг 3. Определение зеркального файла для журнала изменений базы данных (рис. 28).

Рис.28. Определение зеркального файла для журнала изменений базы данных
Пояснение. Вы можете использовать зеркальный файл для журнала изменений базы данных (mirror log file) с тем же именем, но размещенном на другом устройстве. Это позволит предотвратить потерю базу данных при возникновении жесткого сбоя (отказе жесткого диска), но может привести к снижению скорости выполнения операций с базой данных.
Вопрос. Будете ли вы использовать зеркальный файл для журнала изменений базы данных?
Установленный флажок Maintain a mirror log file является положительным ответом на поставленный вопрос. При этом поле окна и кнопка Browse позволяют вам задать полное имя зеркального файла.
Мы не будем использовать зеркальный файл и поэтому приступаем к следующему шагу.
Шаг 4. Установка атрибутов базы данных (рис. 29).

Рис.29. Установка атрибутов базы данных
Вопрос. Какие атрибуты вы хотите определить для файлов новой базы данных?
Альтернативы задаются флажками:
Для повышения производительности при работе с создаваемой базой данных определим значения атрибутов, предлагаемые по умолчанию, т.е. не будем устанавливать ни одного флажка.
Пояснение. Для владельца некоторых системных объектов (системных таблиц) будет определено имя "dbo" (аббревиатура от слов Database object). По своему усмотрению можете заменить его.
Для нас это имя пока не имеет никакого смысла и поэтому ничего менять не будем.
Выполнив шаг 4, переходим к шагу 5 при помощи кнопки Далее.
Шаг 5. Установка размера страницы файлов базы данных (рис. 30).

Рис.30. Установка размера страницы файлов базы данных
Вопрос. Какой размер станицы вы хотите установить для файлов новой базы данных?
Альтернативы задаются переключателем. Выбор страницы желательно выбрать кратным размеру кластера, чтобы сократить время считывания необходимых данных.
После того как выбор произведен делаем следующий шаг.
Шаг 6. Выбор кодовой таблицы для базы данных (рис. 31).

Рис.31. Выбор кодовой таблицы для базы данных
Вопрос. Какую кодовую таблицу вы хотите выбрать для новой базы данных?
Альтернативы предлагаются в виде списка кодовых таблиц. Для представления текстовой информации на русском языке вам предлагаются несколько вариантов. На рис. 31 показан выбор 866-й кодовой таблицу.
Кодовая таблица выбрана, теперь приступаем к выполнению очередного шага.
Шаг 7. Подтверждение готовности к созданию новой базы данных (рис. 32).

Рис.32. Подтверждение готовности к созданию новой базы данных
Пояснение. Вы готовы к созданию базы данных с базовым файлом C:\DATABASE\DUBL_BIBLIA.DB. Вы можете осуществить подключение к базе данных после того как она будет создана.
Установленный флажок Connect to the database означает ваше согласие на подключение базой данных. Мы не будем подключаться сразу, сделаем это позже с клиентской ЭВМ.
Все ранее произведенные действия были подготовительными. Они были предназначены для задания значений параметров утилиты DBINIT (см. табл. - ). Теперь, когда все готово к ее запуску следует нажать на кнопку Готово для начала непосредственного создания новой базы данных. Протокол этого процесса отражается в окне очередном открывающемся окне мастера Create Database утилиты SQL Central (рис. 33).

Рис.33. Протокол процесса создания новой базы данных
Протокол отражает последовательность генерации элементов базы данных и в завершении выдает сообщение о неудачном или успешном создания новой базы данных. Последний случай как раз и представлен на рис. 33.
Если создание базы данных осуществляется в среде утилиты ISQL, то тогда в ее окне Comman () следует выполнить следующий SQL-оператор:
//создание базы данных в утилите ISQL DBTOOL CREATE DATABASE 'c:\Database\Dubl_Biblia.db' /*Полное имя базового файла*/ TRANSACTION LOG //полное имя файла для TO // журнала изменений 'D:\Log_db\Dubl_Biblia.log' IGNORE CASE /* не делать разницы между строчными и прописными буквами */ //ENCRYPT /* признак шифрования, по необходимости */ PAGE SIZE 1024 /* размер страницы */ COLLATION '866rus' /*тип кодовой страницы */ TRAILING SPACES /* признак игнорирования конечных пробелов при сранениях строк */
Протокол процесса создания базы данных в случае применения утилиты ISQL выводится в ее окно Statistics.
ПРИМЕЧАНИЕ
При создании новой базы данных в ней всегда автоматически регистрируется всего один пользователь - DBA с паролем SQL. В дальнейшем пароль может быть изменен. Пользователь DBA имеет класс полномочий DBA (), т.е. пользуется всеми правами администратора базы данных.
В созданной базе данных теперь можно создавать ее объекты. Это станет предметом обсуждения в следующих главах.
Создание индексов
В базах данных для ускорения поиска информации в таблицах применяются специальные структуры - индексы. При отсутствии индексов сканирование записей таблицы осуществляется последовательно в порядке их физического размещения. Наличие индексов предполагает, что анализ записей производится в соответствие с возрастанием/убыванием значений полей, из которых сформирован индекс таблицы. Пользователи могут создать индексы, состоящие из любого числа полей таблицы в различных их сочетаниях. Формировать индексы таблицы имеют право:
Некоторые индексы создаются автоматически. Такие индексы формируются при определении первичных ключей и совокупностей полей с признаками уникальности.
Рассмотрим пример создания индексов. Одним из запросов администратора базы данных является выдача списка книг требуемого издательства, начиная с последних поступлений (). Для сокращения времени его выполнения необходимо создать в таблице Books индекс по возрастанию значений поля Publisher и убыванию значений поля Start_date. Назовем этот индекс Publ_Start_date. Формирование индекса следует начать с установления в утилите SQL Central соединение с базой данных Dubl_Biblia. Затем необходимо запустить мастер Add index, который вложен в папки Tables - Books - Indexes. Этот мастер предлагает выполнить ряд шагов. Каждый шаг представляется в виде отдельного окна. Работу мастера Add index рассмотрим по ранее применявшейся схеме () с разъяснением выполнения последовательности шагов, с анализом каждого шага.
Шаг 1. Начальная стадия создание индекса таблицы данных (рис. 58).

Рис. 58. Создание индекса таблицы данных
Пояснение. Добро пожаловать в Мастер создания индексов. Этот Мастер позволяет вам создать новый индекс таблицы данных.
Индексы, формируемые пользователями СУБД SQL Anywhere, предназначены для сокращения времени поиска данных.
Вопрос. Какое имя вы хотите дать новому индексу?
Ниже следует поле, в которое следует ввести имя создаваемого индекса. В нашем случае - это Publ_Start_date. После заполнения поля окна щелкните мышью по кнопке Далее для выполнения следующего шага.
Шаг 2. Определение условия формирования индекса (рис. 59).

Рис. 59. Определение условия формирования индекса
Вопрос. Какие поля будут использоваться при формирования индекса?
В приведенном ниже списке полей таблицы необходимо выделить одно из полей щелкнуть мышью по одной из кнопок.
Кнопка Add ASC позволяет включить в условие формирования индекса использование значений выделенного поля по возрастанию. Сделанный выбор отображается в окне Curent index. В случае необходимости использования значений выделенного поля по убыванию следует "нажать" на кнопку Add DESC. Кнопка Remove предназначена для исключения из индекса значений выделенного поля. Если требуется исключить из индекса все поля, воспользуйтесь кнопкой Remove All. Просмотреть свойства выделенного поля позволяет кнопка Details.
На рис. 59 представлен результат выделения поля Publisher с последующим использованием кнопки Add ASC и выбора поля Start_date "иажатия" кнопки Add DESC. В результате этого будет сформирован индекс по возрастанию названий издательств (поле Publisher). В пределах одного издательства даты поступления книг в библиотеку будут отсортированы по убыванию.
После задания условия формирования индекса переходим к следующему шагу при помощи кнопки Далее.
Шаг 3. Выбор области базы данных () для хранения индекса (рис. 60).

Рис. 60. Выбор области базы данных для хранения индекса
Пояснение 1. Вы можете сохранить индекс в области базы данных отличной от той, где размещена таблица данных.
Вопрос 1. В какой области базы данных следует сохранить индекс?
Ниже следует список областей базы данных, в которых хранятся компоненты базы данных. По умолчанию индекс размещается в той же области, что и таблица данных.
Пояснение 2. Формирование уникального индекса гарантирует, что в таблице не будет храниться двух записей с одинаковыми значениями полей, используемых при формировании индекса.
Вопрос 2. Вы хотите, чтобы индекс был уникальным?
Для ответа на этот вопрос предназначен флажок The index will be unique. В нашем случае это флажок должен находиться в сброшенном состоянии. Дело в том, что в один и тот же день в библиотеку могут поступить несколько книг одного издательства. По этой причине уникальность совокупности полей Publisher и Start_date не допустима.
Теперь следует "нажать" кнопку Далее для подтверждения готовности к созданию нового индекса.
Шаг 4. Подтверждение готовности к созданию нового индекса (рис. 61).

Рис. 61. Подтверждение готовности к созданию нового индекса
Пояснение 1. Вы можете включить комментарий для нового индекса.
Ниже располагается поле для ввода комментария для создаваемого индекса.
Пояснение 2. Новый индекс Publ_Start_date будет сформирован по возрастанию значений поля Publisher и убыванию значений поля Start_date. Щелкните по кнопке Готово для завершения формирования индекса.
Все действия, выполненные до сих пор в мастере Add index, были предназначены для определения параметров SQL-оператора CREATE INDEX. После щелчка мышью по кнопке Aioiai начнется выполнение этого оператора. Его результатом будет появление индекса Publ_Start_date. Данный факт выражается в появлении одноименного элемента в папке Indexes. (см. рис. 62).

Рис. 62. Обновленное содержание папки Indexes
ПРИМЕЧАНИЕ
Независимо от того, кто создал индекс, его владельцем всегда объявляется владелец таблицы, для которой он создан.
Для создания такого индекса Publ_Start_date в утилите ISQL требуется выполнить следующие SQL-операторы:
// Создание нового индекса CREATE INDEX Publ_Start_date ON Stepanov.Books ("Publisher" /* ASC */, Start_date DESC) // IN SYSTEM; // при необходимости указывается //область базы данных, где будет размещен индекс/ // Комментарий к индексу COMMENT ON INDEX Stepanov.Publ_Start_date is ' Составной индекс по полям Publisher и Start_date для ускорения выполнения запросов, использующих в качестве ключей поиска название издательства и дату поступления книг в библиотеку '
По умолчанию индексы формируются по возрастанию в той же области данных, где размешена таблица данных.
Для того, чтобы в ISQL убедиться в появлении нового индекса требуется проанализировать системное представление SYS.SYSINDEXES.
Индексы удаляются из базы данных только при явном указания об этом. В SQL Central для выполнения этого действия достаточно выделить требуемый индекс и нажать клавишу Del. В ISQL для удаления индекса необходимо выполнить оператор вида:
// Удаление индекса DROP INDEX Publ_Start_date
Для изменения состава индекса его сначала необходимо удалить, а потом создать заново с новыми свойствами.
СУБД SYBASE SQL Anywhere позволяет формировать одиночные и составные индексы с указанием индивидуального порядка использования значений выбранных полей (по возрастанию/убыванию). Это позволяет создавать сложные индексы, способные удовлетворить в большинстве случаев требования пользователей.
Создание представлений
Представления (view) - это одно из мощных средств языка SQL, предназначенное для реализации механизм подсхем пользователей базы данных. Представления позволяют скрыть от пользователей схему базы данных. Они представляют собой хранимые в базе данных запросы, выраженные операторами SELECT. На базе одних представлений могут быть созданы новые представления, которые наследуют все свойства базовых представлений. Формировать представления могут пользователи с привилегиями SELECT для используемых в представлениях таблиц (базовых таблиц).
Для пользователя представления предстают как объекты очень похожие на таблицы данных. Это выражается тем, что:
Однако в соответствие со стандартом ANSI SQL/89 в SYBASE SQL Anywhere таблицы данных и представления имеют некоторые различия:
Представление может быть модифицировано (т.е. по отношении к нему можно использовать операторы INSERT, UPDATE и DELETE) в том, и только в том случае, если для оператора SELECT, на базе которого создано представление, выполняются каждое из следующих специфических условий:
Создадим представление Code_books_1_3 для базы данных Dubl_Biblia, содержимое которого соответствует . Это представление базируется на операторе SELECT (базовый оператор представления) вида:
// оператор SELECT представления Code_bookы_1_3 SELECT //список полей оператора SELECT Books.Code_book, Books.Author, Books.Number FROM Stepanov.Books /*данные выбираются из таблицы Stepanov.Books */ WHERE Code_book>=1 AND //условие Code_book<=3 //выборки.данных
Читателям предлагается для проверки выполнить этот оператор в утилите ISQL.
В утилите SQL Central для определения новых представлений пользователю предлагается шаблон Add View(Template) и мастер Add View(Wizard). Оба они являются элементами папки Views (). Использование шаблона приводит к вызову текстового редактора утилиты. При этом в его окне будет представлена заготовка (шаблон) оператора CREATE VIEW - оператора, создающего представление (рис. 70).

Рис. 70. Окно текстового редактора утилиты SQL Central с заготовкой (шаблоном ) оператора CREATE VIEW
Для формирования заготовки в полноценный оператор необходимо в соответствии с подсказами добавить название представления, необязательные наименования полей и имя владельца представления, а также базовый оператор SELECT.
На рис. 70 окно текстового редактора утилиты приведено с выпадающим меню File. Это связано с тем, что пункты этого меню наиболее часто используются при работе с текстовым редактором. Последний используется при работе с хранимыми процедурами, триггерами и представлениями. Рассмотрим назначение пунктом этого меню.
При выборе пункта Execute Script осуществляется синтаксическая проверка операторов, содержащихся в окне. Без ее положительных результатов содержимое окна невозможно записать в базу данных.
Использование пункта Save To File позволяет записать содержимое окна в файл. Считывание файла в окно редактора производится при помощи пункта Open From File.
Пункт Print предназначен для печати содержимого окна, а пункт Close - для выхода из редактора.
Кроме шаблона, в утилите SQL Central для создания представления может применяться еще и соответствующий мастер Add View(Wizard). Рассмотрим шаги, которые предлагает выполнить этот мастер.
Шаг 1. Начальная стадия создания представления (рис. 71).

Рис. 71. Создание представления
Пояснение. Добро пожаловать в Мастер создания представлений. Этот Мастер позволяет вам создать новое представление. Представления - это объекты, осуществляющие выборку данных из одной или большего числа таблиц. Они могут применяться для выполнения часто используемых запросов или для скрытия определенной информации для обеспечения режима секретности.
Вопрос 1. Какое наименование вы хотите определить для нового представления?
Ниже следует поле, в которое следует ввести имя создаваемого представления. В нашем случае - это Code_books_1_3.
Вопрос 2. Кто будет владельцем представления?
В поле окна, расположенном ниже вопроса отображается имя пользователя владельца создаваемого представления. По умолчанию это имя пользователя создающего представление. Для изменения имени владельца следует воспользоваться кнопкой Change. После щелчка мышью по этой кнопке пользователю предоставляется полный список всех зарегистрированных пользователей базы данный, среди следует осуществить выбор.
После заполнения полей окна "нажмите" на кнопку Далее для выполнения следующего шага.
Шаг 2. Выбор таблиц данных, используемых в представлении (рис. 72).

Рис. 72. Выбор таблиц данных, используемых в представлении
Вопрос. На базе каких таблиц будут формироваться данные представления?
Ниже приводится полный перечень таблиц базы данных. Их выбор определяется при помощи флажков. Кнопка All позволяет установить все флажки, т. е. осуществить выбор всех таблиц. Кнопка None предназначена для сброса всех установленных флажков, т. е. отмены ранее произведенного выбора.
В нашем случае база данных Dubl_Biblia содержит всего две таблицы данных. Для создаваемого представления требуется только таблица Stepanov.Books, выбор которой отмечен установленным флажком.
Произведя выбор таблицы, щелкните мышью по кнопке Далее для перехода к очередному шагу.
Шаг 3. Выбор полей таблиц данных, на базе которых формируется представление (рис. 73).

Рис. 73. Выбор полей таблиц данных, на базе которых формируется представление
Вопрос. Какие поля будут использоваться при формировании содержимого представления?
Для ответа на поставленный вопрос представляется полный перечень полей ранее выбранных таблиц базы данных. Указание полей осуществляется посредством флажков. Назначение кнопок All и None такое же как и при выполнении предыдущего шага.
В нашем случае для представления Code_books_1_3 требуется три поля, выбор которых отмечен флажками.
Теперь приступаем к следующему шагу.
Шаг 4. Подтверждение готовности к созданию нового представления (рис. 74).

Рис. 74. Подтверждение готовности к созданию нового представления
Пояснение 1. Вы можете включить комментарий для нового представления.
Ниже располагается поле для ввода комментария для создаваемого представления.
Пояснение 2. Мастер сгенерирует заготовку для следующего представления:
НазваниеCode_books_1_3
Владелец Stepanov
Щелкните по кнопке Готово для завершения формирования текста представления в редакторе.
После "нажатия" на эту кнопку мастер сформирует заготовку оператора CREATE VIEW и отобразит ее в окне текстового редактора утилиты (рис. 75).

Рис. 75. Отображение заготовки CREATE VIEW в окне текстового редактора утилиты SQL Central
Откорректируем текст заготовки в части базового оператора. Тогда окончательный текст оператора CREATE VIEW примет следующий вид:
//Окончательный текст оператора CREATE VIEW CREATE VIEW Stepanov.Code_books_1_3 AS SELECT Books.Code_book, Books.Author, Books.Number FROM Stepanov.Books WHERE Code_book>=1 AND Code_book<=3
Проверим текст оператора на синтаксис при помощи команды меню File|Execute Script. После ее успешного окончания выходим из текстового редактора. В результате в базе данных появляется новое представление Code_books_1_3. Данный факт выражается в появлении одноименного элемента в папке Views. (см. рис. 76).

Рис. 76. Обновленное содержание папки Views
Для создания представления Code_books_1_3 в утилите ISQL необходимо выполнить оператор CREATE VIEW окончательного вида, приведенный выше. Убедиться в появление нового представления можно, просмотрев список имеющихся в базе данных таблиц и представлений. Он появляется на экране после нажатия на клавишу F7 (). Другим способом проверки наличия в базе данных нового представления является анализ содержимого системного представления SYS.SYSVIEWS. Текст оператора CREATE VIEW можно получить, выполнив следующие SQL-операторы:
// Получение текста представления SELECT Viewtext //поле Viewtext содержит текст представления FROM SYS.SYSVIEWS WHERE Viewname = 'Code_books_1_3' //названия представления /*AND Vcreator = 'Stepanov' ; */ /* если имя представления не уникально, то требуется указать имя его владельца */ //оператор экспорта результатов оператора SELECT OUTPUT TO d:\Log_db\viewtext.sql /* полное имя файла куда осуществляется экспорт текста представления */ FORMAT /* в формате */ ASCII
ПРИМЕЧАНИЕ
При выполнении оператора OUTPUT в формате ASCII все переводы на новую строку исходного текста в формируемый текстовый файл записываются в виде последовательности символов \X0D\X0A.
В SYBASE SQL Anywhere представления создаются оператором CREATE VIEW. Для последующей изменения текста представлений применяется оператор ALTER VIEW. Он заменяет в существующим представлении текст базового оператора. В утилите ISQL в операторе ALTER VIEW каждый раз приходится вводить текст базового оператора. В утилите SQL Central полный текст оператора ALTER VIEW выводится в окне текстового редактора утилиты после двойного щелчка мыши по пиктограмме представления (). В этом случае текст можно отредактировать, используя возможности текстового редактора.
Использовать представления имеют право:
Рассмотрим на примере как определяются привилегии для представлений. Для этого установим пользователю Popova привилегию SELECT для представления Code_books_1_3.
В SQL Central для этого следует выполнить следующую последовательность действий:
Внешний вид закладки Permissions очень похож на одноименную закладку окна свойств таблицы (). Работа с этими закладками осуществляется одним и тем же способом.
Для достижения того же результата в утилите ISQL требуется выполнить следующий SQL-оператор:
/* Установка привилегии SELECT для представления Code_books_1_3 пользователю Popova */ GRANT SELECT ON Stepanov.Code_books_1_3 TO Popova
Теперь пользователь Popova может использовать оператор SELECT для представления Stepanov.Code_books_1_3.
После применения к представлениям операторов INSERT и DELETE количество записей в них изменяется. Тоже самое может произойти при выполнении оператора UPDATE для представлений, использующих указание выборки данных WHERE в базовом операторе. Это может произойти в том случае, когда в результате модификации записей их содержимое перестанет удовлетворять условию WHERE - условию включения данных записей в представление.
Изменение числа записей после операторов INSERT и DELETE очевидно, а после WHERE нет. Пользователь может не иметь никакой информации об условии WHERE. Для контроля за такой ситуации в тексте оператора в конец текст оператора CREATE/ ALTER VIEW следует добавить фразу WITH CHECK OPTION. Тогда при попытке модификации записей представления, которые могут привести к их исключению из ее состава, выдается сообщение о возникновении исключительной ситуации. Покажем это на примере.
Проведем модификацию представления Code_books_1_3. Для этого выполним оператор:
// Модификация представления UPDATE Stepanov.Code_books_1_3 SET Code_book = 100 WHERE Code_book = 2
Исходное и модифицированное содержимое этого представления приведено в табл. 21, 22.
Перечень типов дата/время
| DATE | Тип для представления даты в виде совокупности года, месяца и числа. Значение года может изменяться в диапазоне от 0001 до 9999 года | 4 байта |
| TIME | Тип для представления времени в виде совокупности часа, минут, секунд и долей секунд. Доли секунд хранятся с точностью до 6 знаков. | 8 байт |
| TIMESTAMP | Тип для представления момента времени конкретной даты. Данные хранятся в виде совокупности года, месяца, числа, часа, минут, секунд и долей секунд. Доли секунд хранятся с точностью до 6 знаков. | 8 байт |
| DATETIME | Тоже, что и TIMESTAMP | |
| SMALLDATETIME | Тоже, что и TIMESTAMP |
Обмен данными типа дата/время с базами данных производится:
В первых двух случаях все компоненты данных типа дата/время записываются в свои поля. В результате этого достигается однозначное представление информации. При использовании строки формат данных типа дата/время определяется такими параметрами баз данных как DATA_FORMAT, DATA_ORDER, TIME_FORMAT и TIMESTAMP_FORMAT. Различные сочетания этих параметров порождают большое число вариантов форматов. Однако это не должно вызывать особого беспокойства. Параметры базы данных устанавливаются для всей базы данных и действуют на все приложения и всех пользователей. Форматы данных типа дата/время, определяемые вышеуказанными параметрами баз данных по умолчанию, представлены в табл. 11.
Форматы представления данных типа дата/время, определяемые по умолчанию
| DATE | 'YYYY-MM-DD' |
| TIME | 'HH:NN:ss.SSS' |
| TIMESTAMP | 'YYYY-MM-DD HH:NN:ss.SSS' |
| DATETIME | 'YYYY-MM-DD HH:NN:ss.SSS' |
| SMALLDATETIME | 'YYYY-MM-DD HH:NN:ss.SSS' |
В табл. 11 используются следующие сокращения:
По умолчанию составляющие времени HH, NN, ss, SSS принимаются равными нулю, а DD - единице. Содержимое строк, представляющие данные типа дата/время , конвертируются автоматически. Некоторые примеры такого преобразования приведены в табл. 12.
Примеры преобразования типов дата/время
| DATE | '1994-06-08' '1994-06' '1994-' '1994' | '1994-06-08' '1994-06-01' Ошибка преобразования Ошибка преобразования |
| TIME | '19:50:25.136777' '19:50:25' '19:50' '19:' '19' | '19:50:25.136' '19:50:25.000' '19:50:00.000' '19:50:00.000' Ошибка преобразования |
| TIMESTAMP | '1994-06-08 19:50:25.136777' '1994-06 19:50' '1994-06' | '1994-06-08 19:50:25.000' '1994-06-01 19:50:00.000' '1994-06-01 00:00:00.000' |
К сказанному следует добавить, что к данным типа дата/время применимы арифметические операции, перечень которых представлен в табл. 13.
Арифметические операции, применимые к данным типов дата/время
| DATE | + (-) | INTEGER | DATE | Увеличивает (Уменьшает) значение даты на целое количество дней |
| TIMESTAMP | + (-) | INTEGER | TIMESTAMP | Увеличивает (Уменьшает) значение даты на целое количество дней |
| DATE | + | TIME | TIMESTAMP | Формирует из исходных операндов значение типа TIMESTAMP |
| DATE | - | DATE | INTEGER | Определяет разницу в днях между значения дат исходных операндов |
| DATE | - | TIMESTAMP | INTEGER | Определяет разницу в днях между значения дат исходных операндов |
| TIMESTAMP | - | DATE | INTEGER | Определяет разницу в днях между значения дат исходных операндов |
| TIMESTAMP | - | TIMESTAMP | INTEGER | Определяет разницу в днях между значения дат исходных операндов |
5.3.4. Двоичные типы
Двоичные типы предназначены для представления двоичных данных, включая изображения и другую информацию, не обрабатываемую собственными средствами СУБД. Все двоичные типы приведены в табл. 14.
Двоичные типы SQL Anywhere
| BIT | Тип для представления значений 0 и 1. Аналог полей типа Logical в dBase, FoxPro | 1 байт |
| BINARY | Тоже, что и CHAR, за исключением операций сравнения. В отличии от CHAR, данные этогопо умолчанию 1 байт типа сравниваются на полное совпадение двоичных кодов байтов | до 32767 байт |
| LONG BINARY | Тип для представления двоичных данных произвольной длины | Длина произвольная. Ограничена максимальным размером файлов базы данных (2 гиго- байта) |
| IMAGE | Тоже, что и LONG BINARY |
5.3.5. Пользовательские типы данных
В СУБД SYBASE SQL Anywhere пользователям предоставлена возможность создавать свои типы данных. Они создаются на базе существующих типов
- путем запрета/разрешения записи значений NULL,
- определения значений по умолчанию (установки DEFAULT);
- задания условий на записываемые значения (установки CHECK).
Пользовательские типы можно создать и в утилите ISQL, и утилите SQL Central. В среде ISQL для решения этой задачи необходимо выполнить SQL-оператор CREATE DATATYPE. В SQL Central расширить состав имеющихся типов данных можно при помощи мастера Add User-defined Data Type, являющегося элементом папки User-defined Data Types (). Право создания пользовательских типов данных имеют только пользователи, имеющие право создавать объекты базы данных (класс полномочий Resource) или обладающие правами администратора (класс полномочий DBA). Пользователь, создавший новый тип данных, становится его владельцем. Сразу после появления этого типа данных доступ к нему получают все пользователи, зарегистрированные в базе данных.
Новый тип данных может применяться при определении типов полей и при описании переменных в хранимых процедурах и триггеров. Удалить новый тип может его владелец или пользователь с классом полномочий DBA. Удаление этого типа данных возможно только в том случае, если он нигде не используется.
В завершении анализа типов данных, поддерживаемых SQL Anywhere, необходимо сказать следующее. Большое количество "собственных" типов данных и возможность создания пользовательских типов данных должны удовлетворить запросы самого взыскательного пользователя.
Фрагмент исходной таблицы Books
| 1 | Коршунов Ю.М. | ....... | 49 |
| 2 | Лавров И.А. | ....... | 2 |
| 3 | Трауб Дж | ....... | 38 |
| ... | ....... | ....... | ....... |
Фрагмент исходной таблицы Copies
| ....... | ....... | ....... |
| 49 | 1 | 1 |
| 50 | 2 | 1 |
| 51 | 2 | 1 |
| 52 | 3 | 1 |
| ....... | ....... | ....... |
Поля таблицы Books, представленные в табл. 15, служат для хранения уникального кода книги, фамилии ее автора, еще ряда характеристик и количества ее экземпляров соответственно. В таблице Copies для каждой книги (поле Code_book) представлены номера ее экземпляров (поле N_ book) и признак наличия данного экземпляра в библиотеке, т.е. признак того, его еще не потеряли или не списали (поле Present).
Примеры будем выполнять в утилите ISQL. Перед их выполнением убедимся в том, что в данной утилите установлен режим завершения транзакции при окончании работы с утилитой (). Это позволит проводить все действия с базой данных в виртуальной памяти сервера , не изменяя содержимого базы данных на внешнем носителе. При этом имеется возможность отменить все изменения, проводимые в виртуальной памяти.
Проведем модификацию значения поля Code_book - ключевого поля таблицы Books. Для этого выполним следующий SQL-оператор:
//Изменение значения поля UPDATE Stepanov.Books SET Code_book = 60 WHERE Code_book = 2
Измененное содержимое таблиц Copies и Books представлено в табл. 17, 18.
Фрагмент таблицы Books после после выполнения оператора UPDATE
| 1 | Коршунов Ю.М. | ....... | 49 |
| 60 | Лавров И.А. | ....... | 2 |
| 3 | Трауб Дж | ....... | 38 |
| ....... | ....... | ....... | ....... |
Фрагмент таблицы Copies выполнения оператора UPDATE
| ....... | ....... | ....... |
| 49 | 1 | 1 |
| 50 | 60 | 1 |
| 51 | 60 | 1 |
| 52 | 3 | 1 |
| ....... | ....... | ....... |
Как видно из табл. 17, 18, изменение адресуемого поля родительской таблицы автоматически влечет изменение значение полей, входящих в состав внешнего ключа дочерней таблицы. При модификации неключевых полей родительской таблицы, дочерняя таблица останется неизменной.
Для отмены результатов произведенной модификации таблиц выполним оператор ROLLBACK - оператор отката к началу транзакции. При этом содержимое виртуальной памяти обнуляется, а на внешнем носителе база данных остается неизменной.
Теперь попробуем удалить запись родительской таблицы, на которую имеются ссылки из дочерней таблицы - запись, у которой поле Code_book=2. Для этого выполним оператор вида:
// Удаление записи таблицы DELETE FROM Stepanov.Books WHERE Code_book=2
Поскольку для внешнего ключа Code_book такие действия запрещены, пользователю будет выдано сообщение "primary key for row in table 'Copies' is referenced in another table". Оно является сообщением об аварийном завершении оператора и означает, что на первичный ключ текущей таблицы (в нашем случае таблица Stepanov.Books) имеется ссылка из таблицы Copies.
Проверим действие внешнего ключа для таких ограничений ссылочной целостности как Update Action/Restrict Update и Delete Action/ Cascade (). Установить эти ограничения можно следующим образом. Щелкните правой кнопки мыши по пиктограмме внешнего ключа Code_book (). В появившемся в результате этого контекстном меню выберите пункт Properties. В открывшемся окне свойств внешнего ключа выберите закладку Integrity. Она в имеет такой же вид как и окно шага 5 мастера Add Foreign Key (). Манипулирование переключателями Update Action и Delete Action данной закладки позволяют решить поставленную задачу.
Для достижения того же эффекта в ISQL необходимо выполнить следующую последовательность SQL-оператор:
/* Удаление существующего внешнего ключа таблицы данных*/ ALTER TABLE Stepanov.Copies DELETE FOREIGN KEY Books_Copies; /* Формирование нового внешнего ключа таблицы данных*/ ALTER TABLE Stepanov.Copies ADD Books_Copies NOT NULL FOREIGN KEY(Code_book) // в состав // ключа входит только поле Code_book REFERENCES // ключ ссылается на поле Stepanov.Books(Code_book) //Code_book //таблицы Stepanov.Books */ ON UPDATE RESTRICT /* запрещение модификации адресуемых полей родительской таблицы */ ON DELETE CASCADE; /* каскадное удаление записей таблицы дочерней таблицы, ссылающихся на удаляемую запись родительской таблицы */
Выполним те же SQL-операторы UPDATE и DELETE уже при этих ограничениях целостности. При этом выполнение оператора UPDATE будет запрещено. Результатом работы оператора DELETE будет изменение таблиц Books и Copies, представленное в табл. 19, 20.
Таблица 19. Фрагмент таблицы Books после выполнения оператора DELETE
| 1 | Коршунов Ю.М. | ....... | 49 |
| 3 | Трауб Дж | ....... | 38 |
| ....... | ....... | ....... | ....... |
Фрагмент таблицы Copies после выполнения оператора DELETE
| ....... | ....... | ....... |
| 49 | 1 | 1 |
| 52 | 3 | 1 |
| ....... | ....... | ....... |
Анализ табл. 19, 20 показал, что синхронное удаление записей обеих таблиц происходит таким образом, чтобы не было "висячих" ссылок. Теперь вернем внешний ключ в предыдущее состояние.
Таким образом, использование внешних ключей позволяет освободить пользователей от выполнения некоторых проверок, направленных на поддержание ограничений ссылочной целостности данных. При этом вводимые ограничения сразу действуют на все приложения, гарантируя от того, что в некоторых из них "забыли" провести изменения.
Исходное содержимое представления Stepanov.Code_books_1_3
| 1 | Коршунов Ю.М. | 49 |
| 2 | Лавров И.А. | 2 |
| 3 | Трауб Дж | 38 |
в исходное состояние. После этого
| 1 | Коршунов Ю.М. | 49 |
| 3 | Трауб Дж. | 38 |
//Изменение текста представления ALTER VIEW Stepanov.Code_books_1_3 AS SELECT Books.Code_book, Books.Author, Books.Number FROM Stepanov.Books WHERE Code_book>=1 AND Code_book<=3 WITH CHECK OPTION
Теперь выполним тот же оператор UPDATE. При этом оператор завершится аварийно с выдачей сообщения "WITH CHECK OPTIPN violated for view 'Books'". Оно информирует пользователя о нарушения условия WITH CHECK OPTION для представления, созданного на базе таблицы Books.
В завершении рассуждений о представлениях приведем несколько примеров. Представление на базе таблицы и представления, выдающее номера экземпляров книг с кодом 2:
//представление на базе таблицы и представления CREATE VIEW Stepanov.Table_View AS SELECT Code_books_1_3.Code_book //для этого поля AS b_code, //вводися псевдоним b_code Copies.N_books FROM Stepanov.Copies NATURAL JOIN Stepanov.Code_books_1_3 WHERE b_code=2
Следующим является представление на базе двух таблиц с использованием арифметической функции Count (подсчет числа записей):
//представление на базе двух таблиц CREATE VIEW Stepanov.Table_table AS SELECT Books.Code_book, "COUNT"(Copies.Code_book) FROM Stepanov.Books NATURAL JOIN Stepanov.Copies GROUP BY Books.Code_book
Это представление выбирает данные о количестве экземпляров каждой книги. Тот же результат можно получить, если при помощи оператора ALTER VIEW заменить в представление Table_table базовый оператор на следующий:
/* Новый базовый оператор представления Table_table */ SELECT Code_book, Number FROM Stepanov.Books
Читателям предлагается проверить работу приведенных выше представлений.
Таким образом, использование представлений является удобным средством использования часто используемых запросов и защиты от несанкционированного доступа.
Привилегии, применимые к таблицам данных
| ALTER | Позволяет модифицировать структуру таблиц данных и создавать для этой таблицы триггеры |
| DELETE | Разрешает удалять записи из таблиц и представлений |
| INSERT | Определяет правомочность добавление новых записей в таблицы и представления |
| REFERENCES | Можно создавать индексы таблицы и внешние ключи, которые ссылаются на таблицу. Привилегия может быть назначена как на все, так и на совокупность полей таблицы |
| SELECT | Предоставляет возможность проведения выборки данных из таблиц и представлений, а также создания представлений. Привилегия может быть назначена как на все, так и на совокупность полей таблицы |
| UPDATE | Позволяет производить модификацию записей таблиц и представлений. Эта привилегия может быть установлена как для всех полей таблицы, так и их некоторого подмножества. Привилегия может быть назначена как на все, так и на совокупность полей таблицы |
| ALL | Устанавливает все привилегии по манипулированию таблицей |
Для хранимых процедур и функций определена только одна привилегия - EXECUTE. Она предоставляет пользователю возможность запускать хранимые процедуры или функции.
Для представлений могут быть установлены привилегии DELETE, INSERT, SELECT и UPDATE. Назначение этих такое же как и у одноименных привилегий таблиц данных, за исключением того, что привилегии SELECT и UPDATE не могут быть установлены для отдельных полей представлений.
Привилегии могут быть как индивидуальными, так и групповыми. Индивидуальные привилегии устанавливаются для отдельных пользователей, а групповые - для групп пользователей.
Рассмотрим процедуру регистрации индивидуальных пользователей и групп пользователей на примере ранее созданной базы данных Dubl_Biblia. Произведем регистрацию администратора базы данных и пользователей - библиотекарей. В качестве администратора назначим пользователя Степанова Ю.Л., а библиотекарями - пользователей Петрову Ю.П., Иванову С.В., Сидорову О.К. и Попову И.Н. Назначим им следующие пользовательские имена: Stepanov, Petrova, Ivanova, Sidorova и Popova, соответственно.
ПРИМЕЧАНИЕ
Регистрацию как отдельных пользователей, так и групп пользователей может производить только пользователь с правами администратора базы данных.
Сначала рассмотрим как эта процедура выполняется в утилите SQL Central. Для ее проведения необходимо произвести соединение с базой данных. Пока в базе данных Dubl_Biblia хранится информация только о пользователе DBA, имеющего пароль SQL. Под его именем и подключимся к базе данных.
Зарегистрируем сначала администратора базы данных Dubl_Biblia - пользователя под именем Stepanov. Для этого раскройте папку Users & Groups (рис. 34). В результате в левой панели будут отображены имена всех зарегистрированных индивидуальных пользователей и названий групп пользователей.

Рис.34. Содержимое раскрытой папки "User & Groups" в утилите SQL Central
Как видно из рис. 34, в новой базе данных зарегистрирован только пользователь DBA и имеется две группы пользователей PUBLIC и dbo. Имя последней задается при создании базы данных (). Папка содержит Users & Groups также мастера Add user и Add Group. Первый из них предназначен для регистрации новых пользователей, а второй - для создания групп пользователей. Воспользуемся мастером Add user, щелкнув по его пиктограмме мышью. Действия, проводимые в нем, будем описывать по схеме (см. рис. ) в виде последовательности шагов, принятой при создании базы данных.
Шаг 1. Начало регистрации нового пользователя базы данных (рис. 35).

Рис.35. Начало регистрации нового пользователя базы данных
Пояснение. Добро пожаловать в Мастер регистрации пользователей. Этот мастер позволяет вам осуществить регистрации нового пользователя базы данных.
Вопрос 1. Под каким именем вы хотите зарегистрировать нового пользователя?
Ниже следует поле, в которое следует ввести имя пользователя. В нашем случае это имя Stepanov.
Вопрос 2. Какой пароль вы хотите присвоить новому пользователю?
Текст пароля вводится в поле Passworsd. В поле Confirm необходимо подтвердить пароль. В рассматриваемом случае в качестве пароля используется символ s.
Флажок User/Group is allowed to connect определяет право соединения регистрируемого пользователя с базой данных. В рассматриваемой версии SYBASE SQL Anywhere регистрация пользователей, не имеющих такого права, не имеет смысла. Этой флажок остался от предыдущих версий.
После выполнения предлагаемых действий щелкните мышью по кнопке Далее для выполнения следующего шага.
Шаг 2. Выбор класса полномочий (рис. 36).

Рис.36. Выбор класса полномочий
Вопрос. Какими классами полномочий, которыми будет обладать новый пользователь?
Каждому классу полномочий соответствует одноименный флажок. По умолчанию для пользователя устанавливается флажок Remote DBA, соответствующий классу полномочий Remote DBA (см. ). В нашем случае для администратора базы данных Dubl_Biblia необходимо установить еще и флажок DBA, соответствующий классу полномочий DBA (см. ).
Выбрав классы полномочий, переходим к следующему шагу.
Шаг 3. Подтверждение регистрации нового пользователя (рис. 37).

Рис.37. Подтверждение регистрации нового пользователя
Пояснение. В используемой базе данных не зарегистрирован издатель. Вы можете зарегистрировать данного пользователя в качестве издателя или сделать это в любое другое время.
Флажок User is the publisher позволяет зарегистрировать пользователя как издателя в процессе репликации данных. В большом поле в центре окна вы можете записать соответствующий комментарий.
Все действия выполняемый в шагах 1- 3, являются подготовительными. Их цель состояла в формировании параметров для SQL-операторов, осуществляющих регистрацию пользователей. Для подтверждения правильности ранее введенных параметров нажмите кнопку Готово. После этого произойдет окончательное формирование соответствующих SQL-операторов, которые будут отправлены на сервер. В случае успешного их выполнения сервером, в базе данных будет зарегистрирован пользователь Stepanov. Таким образом в базе данных теперь имеется два пользователя с полномочиями администратора базы данных.
Теперь в базе данных Dubl_Biblia имеется информация о ее администраторе - пользователе Stepanov. Для регистрации в качестве пользователей библиотекарей (пользователей Petrova, Ivanova, Sidorova и Popova) проведем аналогичные действия. В качестве пароля для каждого из библиотекарей будем использовать первую букву в имени пользователя. Единственное отличие состоит только в том, для библиотекарей не будет определено никаких классов полномочий. В результате этого в базе данных будет зарегистрировано еще 4 пользователя (см. рис. 38).

Рис.38. Обновленный состав пользователей базы данных
Для библиотекарей не был установлен класс полномочий DBA. По этой причине при их подключении в утилите SQL Central к базе данных Dubl_Biblia будет выдаваться предупреждение. Оно гласит от том, что пользователь не является администратором базы данных, в связи с чем доступ его к отдельным папкам утилиты будет ограничен.
Регистрация пользователей в среде утилиты ISQL осуществляется выполнением SQL-операторов GRANT. Для того, чтобы зарегистрировать пользователя c именем Stepanov как администратора базы данных необходимо выполнить следующую последовательность SQL-операторов:
/* Регистрация пользователя "Stepanov" с паролем "s", с предоставлением ему права соединения с базой данных */ GRANT CONNECT TO Stepanov IDENTIFIED BY s; /* Установление пользователю "Stepanov" класса полномочий DBA */ GRANT DBA TO Stepanov; /* Установление пользователю "Stepanov" класса полномочий Remote dba */ GRANT Remote DBA TO Stepanov; /*Определение комментария для пользователя "Stepanov"*/ COMMENT ON USER Stepanov IS 'Пользователь Stepanov является администратором базы данных Dubl_Biblia'
Для регистрации библиотекарей в качестве пользователей требуется выполнить следующие SQL-операторы:
/* Регистрация пользователей - библиотекарей с предоставлением им права соединения с базой данных */ GRANT CONNECT TO Petrova IDENTIFIED BY p; GRANT CONNECT TO Ivanova IDENTIFIED BY i; GRANT CONNECT TO Sidorova IDENTIFIED BY s; GRANT CONNECT TO Popova IDENTIFIED BY p; /*Определение комментария для пользователей - библитотекарей */ COMMENT ON USER Petrova IS 'Библиотекарь Петрова Ю.П. '; COMMENT ON USER Ivanova IS 'Библиотекарь Иванова С.В.'; COMMENT ON USER Sidorova IS 'Библиотекарь Сидорова О.К.'; COMMENT ON USER Popova IS 'Библиотекарь Попова И.Н.'
Если вы не можете воспользоваться утилитой SQL Central, убедиться в том, регистрация пользователей была успешно осуществлена можно и в среде утилиты ISQL. Для этого следует считать информацию из системного представления SYS.SYSUSERLIST, что можно сделать путем выполнения следующего запроса:
/* Получение информации о зарегист- рированных пользователях в ISQL */ SELECT * FROM SYS.SYSUSERLIST
Пользователи базы данных могут быть объединены в группы. Необходимость создания групп обусловлена удобством управления привилегиями пользователей. Дело в том, что эта процедура, применяемая в отдельности к каждому из индивидуальных пользователей, является весьма утомительной. Особенно остро это ощущается при большом количестве пользователей и необходимости быстро изменить их права. Для решения этой задачи применяется объединение равноправных пользователей в группы. Точно также решаются данный вопрос и других системах, где защита от несанкционированного доступа имеет большое значение. Например, именно так обстоит дело в многопользовательских операционных системах, базах данных и вычислительных сетях. При этом на уровне группы легко меняются привилегии пользователей-членов групп. Такие пользователи имеют как индивидуальные, так и групповые привилегии. Индивидуальные привилегии устанавливаются для отдельных пользователей, а групповые - для групп пользователей. В отличие от привилегий, классы полномочий в SYBASE SQL Anywhere устанавливаются только индивидуально, для каждого пользователя в отдельности.
Для удобства управления привилегиями пользователей в базе данных Dubl_Biblia, объединим всех библиотекарей в группу пользователей LIBRARIANS (библиотекари).
Для образования новой группы пользователей в SQL Central необходимо использовать мастер Add Group (). Этот мастер выполняет ряд шагов, которые описаны ниже.
Шаг 1. Начало создания новой группы пользователей базы данных (рис. 39).

Рис.39. Начало создания новой группы пользователей базы данных
Пояснение. Этот мастер позволяет вам создать новую группу пользователей базы данных.
Вопрос 1. Под каким именем вы хотите создать новую группу пользователей?
Ниже следует поле, предназначенное для задания наименования группы пользователей. Для библиотекарей мы создаем группу LIBRARIANS.
Вопрос 2. Какой пароль вы хотите присвоить новой группе?
В рассматриваемой версии при создании группы пользователей поля Passworsd и Confirm, а также флажок User/Group is allowed to connect не имеют никакого значения. Их значения не считываются .Эти элементы являются наследством предыдущих версий. По этой причине оставляет вышеуказанные поля не заполненными и снимаем флажок User/Group is allowed to connect.
Шаг 2 и шаг 3 данного мастера точно такие же как и у мастера Add user. (см. рис. , ). Кроме комментария в шаге 3, остальные данные на этих шагах не имеют смысла. В связи с этим в шаге 2 сразу "нажмем" на копку Далее. Наличие данных бессмысленных шагов объясняется наследственностью предыдущих версий.
После завершения работы с мастером Add Group в базе данных появляется еще одна группа пользователей - группа LIBRARIANS. При этом в папку Users & Groups () будет добавлена пиктограмма группы пользователей - LIBRARIANS.
Для того, чтобы создать такую группу пользователей в утилите ISQL требуется выполнить следующие SQL-операторы:
/* Регистрация нового пользователя LIBRARIANS без определения пароля /* GRANT CONNECT TO LIBRARIANS; /* Установка класса полномочий Remote DBA, т. к. в шаге 2 сразу перешли к следующему шагу */ GRANT Remote DBA to LIBRARIANS; /* Предоставление пользователю возможности иметь подчиненных пользователей*/ GRANT GROUP TO LIBRARIANS; COMMENT ON USER LIBRARIANS IS 'Группа библиотекарей'
Для того, чтобы удостовериться в утилите ISQL в том, что группа LIBRARIANS была создана и она пока не объединяет ни одного пользователя необходимо считать информацию из системных представлений SYS.SYSUSERLIST и SYS.SYSGROUPS.
Как видно из вышерассмотренных SQL-операторов, группы пользователей фиксируются в базе данных таким же образом как и индивидуальные пользователи. Однако отсутствие пароля не дает возможность осуществить соединение с использованием в качестве имени пользователя наименования группы.
Только что созданная группа LIBRARIANS не объединяет пока ни одного пользователя. Включим в ее состав зарегистрированных библиотекарей.
В SQL Central для выполнения этой задачи следует выделить пиктограмму пользователя, включаемого в группу, и удерживая левую кнопку мыши перетащить ее к пиктограмме группы. Объединим таким образом всех библиотекарей в группу LIBRARIANS. После этого щелкнем мышью по пиктограмме LIBRARIANS. Тогда в правой панели утилиты будет показан состав группы пользователей LIBRARIANS (рис. 40). При этом в левой для дальнейших рассуждений раскрыта вся иерархия групп пользователей.

Рис.40. Состав группы пользователей LIBRARIANS
В утилите ISQL такого же эффекта позволяет достичь выполнение ниже приведенных SQL-операторов:
/*Включение пользователей - билиотекарей в группу LIBRARIANS */ GRANT MEMBERSHIP IN GROUP LIBRARIANS TO Ivanova; GRANT MEMBERSHIP IN GROUP LIBRARIANS TO Petrova; GRANT MEMBERSHIP IN GROUP LIBRARIANS TO Popova; GRANT MEMBERSHIP IN GROUP LIBRARIANS TO Sidorova
Проверить результаты включения библиотекарей в группу LIBRARIANS в среде ISQL можно, обратившись к системному представлению SYS.SYSGROUPS.
Теперь привилегии, устанавливаемые для группы LIBRARIANS, автоматически распространяются на всех пользователей - библиотекарей, входящих в группу.
Любой отдельный пользователь, также как и группа пользователей, может входить в состав нескольких групп. В свою очередь каждая группа может включать в качестве своих членов несколько пользователей и групп. Члены группы наследуют привилегии, установленные во всех группах, в которые они входят.
При создании базы данных в ней автоматически создаются три пользовательские группы: SYS, dbo и PUBLIC. О них коротко упоминалось при рассмотрении утилиты ISQL () и при обсуждении создания базы данных (). Группа SYS выступает как владелец всех системных таблиц и представлений. (Следует напомнить, что владельцами объектов являются пользователи их создавшие.) Группа dbo введена в состав баз данных СУБД SQL Anewhere для обеспечения совместимости с базами данных СУБД SYBASE SQL Server. Эта группа является владельцем представлений, созданных на основе системных таблиц и представлений. Представления группы dbo имеют такие же названия, содержат те же поля и хранят такую же информацию, что и одноименные системные таблицы и представления СУБД SYBASE SQL Server. В объектах, владельцами которых являются группы SYS и dbo, хранится вся служебная информация о базе данных.
В пользовательскую группу PUBLIC входят все регистрируемые в базе данных отдельные пользователи и группы пользователи. Пользователи включаемые затем в другие группы тем не менее остаются членами группы PUBLIC. В этой группе установлена привилегия SELECT () для некоторых системных таблиц и всех системных представлений. Поэтому любой пользователь имеет возможность считать некоторую информацию о базе данных.
В базах данных СУБД SQL Anywhere информация о вхождении отдельных пользователей и групп пользователей в состав других групп хранится в системном представлении SYS.SYSGROUP. На основании информации из этого представления составлена схема взаимосвязей групп пользователей для базы данных Dubl_Biblia (рис. 41).

Рис.41. Схема взаимосвязей групп пользователей базы данных Dubl_Biblia
Из рис. 41 видно, что пользователь DBA имет привилегии, определенные в группах SYS, dbo и PUBLIC. На пользователей Ivanova, Petrova, Popova и Sidorova распространяются привилегии, установленные в группах SYS, dbo , PUBLIC и LIBRARIANS.
Перечень символьных типов
| CHAR | Строковый тип | до 32767 байт. по умолчанию 1 байт |
| CHARACTER | Тоже, что и CHAR | |
| CHARACTER VARYING | Тоже, что и CHAR | |
| VARCHAR | Тоже, что и CHAR | |
| LONG VARCHAR | Символьный тип произвольной длины. Аналог МЕМО-полям в dBase, FoxPro, Access | Длина произвольная. Ограничена максимальным размером файлов базы данных (2 гигобайта) |
| TEXT | Тоже, что и LONG VARCHAR |
Данные символьных типов представляются двоичными кодами. То, как они отображаются на экранах мониторов или распечатках принтера определяется так называемыми кодовыми таблицами. СУБД SYBASE SQL Anywhere поддерживает более 50 кодовых таблиц. Они позволяют отображать текстовую информацию символами различных алфавитов, начиная от английского, русского, греческого, испанского и кончая китайским и японским. Информация об имеющихся кодовых таблицах хранится в системной таблице SYS.SYSCOLLATION. Для извлечения из нее данных достаточно выполнить оператор
SELECT * FROM SYS.SYSCOLLATION
Для того, чтобы получить информацию о кодовой таблице используемой в базе данных необходимо воспользоваться утилитой DBINFO (см. табл. - ). Для этого в утилите ISQL следует запустить ее на выполнение следующим образом:
/*Получение информации о базе данных Dubl_Biblia*/ DBTOOL DBINFO DATABASE 'c:\database\dubl.db' //полное имя базового файла TO 'c:\database\dbinfo.txt' /*полное имя файла для записи результата */ USING 'UID=Stepanov; PWD=S' /*строка пара- метров соединения */
При использовании символьных данных нужно проверить как отображается символьная информация, хранимая в базе данных на вашей ЭВМ. На разных ЭВМ, в разных операционных системах и даже в разных приложениях она может визуально представляться по - разному. Например, автор при создании базы данных Biblia столкнулись со следующим фактом. При использовании кодовой странице 866RUS текстовые данные, хранимые в этой базе данных, нормально отображались символами русского алфавита в утилите ISQL. При считывании этих же данных через интерфейс ODBC в системах Access и Borland Delphi на экране появлялась непонятная абракадабра. Только после настройки параметров источника данных (было заполнено поле Translator Name - ) проблема была решена.
5.3.2. Числовые типы
Числовые типы предназначены для обозначения целых, вещественных и денежных типов. Представители числовых типов приведены в табл. 9.
Перечень числовых типов
| INTEGER | от -2 147 483 648 до +2 147 483 647 | 0 | 4 байта |
| INT | Тоже, что и INTEGER | ||
| SMALLINT | от -32 768 до +32 767 | 0 | 2 байта |
| REAL | от -3.4 e-38 до 3.4 e+38 | до 6 | 4 байта |
| FLOAT | Тоже, что и REAL | ||
| DOUBLE | от -1.797 e-308 до +1.797 e+308 | до 15 | 8 байт |
| TINYINT | от 1 до 255 | 0 | 1 байт |
| DECIMAL | числа состоящие из N цифр c M цифрами в дробной части. По умолчанию N=30, M=6 | M | сколько требуется |
| NUMERIC | Тоже, что и DECIMAL | ||
| MONEY | Для хранения денежных величин. Допустимо значение NULL. Числа из 20 цифр, с 4 цифрами после запятой | 4 | |
| SMALLMONEY | Для хранения денежных величин. Допустимо значение NULL.. Числа из 10 цифр, с 4 цифрами после запятой | 4 |
5.3.3. Типы дата/время
Типы дата/время предназначены для хранения времени, дат и дат совместно с временем. Такие типы, поддерживаемые СУБД SQL Anywhere, перечислены в табл. 10.
Вы подготовили данные для создания внешнего ключа
:
Books_Copies
на базе поля:
Code_book.
Пояснение 2. Информация о родительской таблице.
Родительская таблица:
Books
адресуемым поле:
Code_book.
Щелкните мышью по кнопке Готово для создания внешнего ключа.
Целью шагов 1-6 мастера Add Foreign Key является подготовка к выполнению операторов ALTER TABLE. После щелчка мышью по кнопке Aioiai (шаг 6) начнется выполнение этого оператора. Его результатом будет появление нового внешнего ключа Books_Copies. Данный факт выражается в появлении одноименного элемента в папке Foreign Keys таблицы Copies (см. рис. 69).

Рис. 69. Обновленное содержание папки Foreign Keys
Кроме того в папке Referenced By таблицы Books отображается наличие через внешний ключ ссылку на эту таблицу из таблицы Copies.
Для создания в утилите ISQL внешнего ключа Books_Copies требуется выполнить следующие SQL-операторы:
//Создание внешнего ключа ALTER TABLE Stepanov.Copies ADD "Books_Copies " NOT NULL FOREIGN KEY(Code_book) //внешний ключ //состоит из поля Code_book REFERENCES /* он ссылается на поле Code_book таблицы Stepanov.Books */ Stepanov.Books(Code_book) ON UPDATE CASCADE /* каскадное обновление полей внешнего ключа дочерней таблицы при изменение адресуемых полей родительской таблицы */ ON DELETE RESTRICT /* запрещение удаления записей родительской таблицы, на которую имеются ссылки из дочерей таблицы */ // CHECK ON COMMIT /* признак проверки целостности только при выполнении оператора COMMIT */ COMMENT // комментарий к внешнему ключу ON FOREIGN KEY Stepanov.Copies.Books_Copies IS 'Внешний ключ для поддержания ограничений ссылочной целостности между таблицами Copies и Books'
Для того, чтобы убедиться в утилите ISQL, в том что внешний ключ Books_Copies действительно был создан необходимо при помощи оператора SELECT проанализировать системное представление SYS.SYSFOREIGNKEYS.
Рассмотрим на примерах действие внешнего ключа Books_Copies по обеспечению ссылочной целостности. Для этого приведем по одному фрагменту из таблиц Copies и Books (табл. 15, 16).
Хранимые функции
Хранимые функции являются разновидностью хранимых процедур. Они включены в состав программных объектов баз данных с целью наибольшего соответствия языкам программирования, например Си или Паскаль. Как и в этих языках программирования, каждая хранимая функция рассматривается в качестве выражения, формирующего одно единственное значение. Хранимые функции применяются для расширения функциональных возможностей операторов SELECT и ряда других SQL-операторов.
Функции создаются оператором CREATE FUNCTION. Их модификация производится при помощи оператора ALTER FUNCTION. Для разработки функций пользователи должны иметь класс полномочий RESOURCE (). В качестве примера представим хранимую процедуру Get_number_absent () в виде хранимой функции Fun_get_num_abs:
//Создание новой функции CREATE FUNCTION Fun_get_num_abs /* Функция определяет количество книг, находящихся на руках у читателя, имеющего читательскую карточку с номером Par_N_reader. Это количество возвращается в качестве результата функции. */ ( Par_N_reader SMALLINT ) RETURNS SMALLINT BEGIN DECLARE Count_books SMALLINT; SELECT COUNT(*) INTO Count_books FROM Stepanov.Absent WHERE N_reader = Par_N_reader; RETURN (count_books); END
Для проверки работы этой функции следует выполнить следующие SQL-операторы:
//Проверка процедуры Fun_get_num_abs /* Если переменная уже есть, то создавать ее заново нельзя */ //CREATE VARIABLE Rez SMALLINT; /* Вызов функции и присваивание ее результатов переменной Rez */ SET Rez = Fun_get_num_abs(80); SELECT Rez
В результате обращения к функции Fun_get_num_abs в переменную Rez запишется значение четыре, точно такое же как после выполнения процедуры Get_number_absent.
Оператор CREATE FUNCTION несколько отличается от оператора CREATE PROCEDURE. Эти отличия состоят в следующем:
Хранимые функции могут вызываться любым пользователем, имеющего для соответствующей функции привилегию EXECUTE. Для предоставления права вызова функций, также как и для процедур, используется оператор GRANT EXECUTE. Чтобы предоставить библиотекарям возможность применения функции fun_get_num_abs необходимо выполнить следующий оператор:
//Установка привилегии EXECUTE библиотекарям GRANT EXECUTE ON Fun_get_num_abs TO LIBRARIANS
Опять же, как для процедур, лишение привилегий на использование функций осуществляется оператором REVOKE EXECUTE:
//Лишение библиотекарей привилегии EXECUTE REVOKE EXECUTE ON Fun_get_num_abs TO LIBRARIANS
Ранее созданные функции хранятся в базах данных до тех, пока они не удаляются посредством оператора DROP FUNCTION. Для удаления из базы данных функции Fun_get_num_abs необходимо выполнить этот оператор следующим образом:
//Удаление функции DROP FUNCTION Fun_get_num_abs.
Удаление функции может производить только ее владелец или пользователь с полномочиями класса DBA ().
Вызов Функции должен осуществляться там, где требуется выражение, формирующее значение. В связи с этим, функции могут непосредственно использоваться в выражениях. Например, они могут применяться в арифметических выражениях, вместо фактических параметров процедур или функций, а также прямо в составе SQL-операторов. Все эти качества позволяют в значительной степени расширить функциональные возможности языка SQL, как средства разработки приложений.
Хранимые процедуры
Хранимые процедуры - это подпрограммы на языке SQL, хранящиеся в базах данных и представляющие собой один из видов их общих ресурсов. Тело любой хранимой процедуры представляет последовательность SQL-операторов, например таких, как выборка данных (SELECT), их модификация (UPDATE), удаление данных (DELETE), операторы цикла (LOOP), условные операторы (IF, CASE) и ряд других. Процедуры вызываются оператором CALL и могут использовать как входные параметры (передающие значения в процедуру), так и выходные параметры (возвращающие результаты процедуры вызывающему программному объекту). Процедуры могут вызываться из процедур, функций и других типов программных объектов.
Хранимые процедуры, создаются оператором CREATE PROCEDURE. Модификация тела хранимой процедуры осуществляется оператором ALTER PROCEDURE. Эти операторы могут использовать:
Приводимый пример иллюстрирует применение оператора CREATE PROCEDURE для создания процедуры Ins_absent. Эта процедура предназначена для фиксирования в базе данных факта выдачи некоторой книги одному из читателей:
//Создание новой процедуры CREATE PROCEDURE Ins_absent /* Процедура, фиксирующая факт выдачи книги с инвентарным номером par_N_books читателю, имеющему читательскую карточку, с номером Par_N_read Этот факт записывается в таблицу Absent. Владельцем таблицы Absent является пользователь Stepanov. В данной таблице при выполнении оператора INSERT полю Beg_date (дата выдачи книги) по умолчанию присваивается текущая дата. Книга выдается на 15 дней. На основании этого определяется дата ее возврата - значение для поля End_date */ ( IN Par_N_books SMALLINT, IN Par_N_reader SMALLINT ) BEGIN INSERT INTO Stepanov.Absent (n_books, N_reader, End_date) VALUES( Par_N_books, Par_n_reader, (current date+15)) END
Если выполнить этот оператор в утилите ISQL, то в базе данных будет создана хранимая процедура Ins_absent. Проверить этот факт можно проанализировав содержимое системного представления SYS.SYSPROCPARMS.
Тело хранимой процедуры является составным оператором, т.е. совокупностью операторов, заключенных между служебными словами BEGIN и END. В приведенном примере составной оператор состоит из одного оператора INSERT. Наряду с SQL-операторами в составном операторе могут быть определены локальные переменные, курсоры, временные таблицы данных и исключительные ситуации. Они доступны только в пределах составного оператора и не видимы за его пределами. Время их существования ограничено периодом исполнения составного оператора. Локальные определения широко используются при разработке программных объектов. Будут они применяться и в данной главе.
Описание каждого формального параметра в процедуре начинается с одного из служебных слов IN, OUT или INOUT. Они предназначены для указания типа формального параметра. Ниже приводится пояснения к типам формальных параметров:
В процедуре Ins_absent используются только входные параметры. Тип данных каждого формального параметра должен соответствовать одному из типов данных, поддерживаемых SQL Anywhere ().
Вызов хранимых процедур производится оператором CALL с соответствующими фактическими параметрами.
Установим соединение с в утилите ISQL и обратимся к процедуре Ins_absent следующим образом:
//Вызов процедуры на исполнение CALL Ins_absent (1001, 25)
После этого при помощи оператора SELECT просмотрим содержимое таблицы Stepanov.Absent, чтобы удостовериться в работоспособности процедуры Ins_absent:
//Просмотр таблицы Stepanov.Absent //для проверки внесенных изменений SELECT * FROM Stepanov.Absent WHERE N_books>1000 AND N_books<1050
Теперь вернем базу данных в исходное состояние при помощи оператора ROLLBACK.
При определении хранимых процедур, помимо явного указания значений фактических параметров, имеется возможность использования значений параметров по умолчанию. В связи с этим, текст процедуры Ins_absent может быть видоизменен в части определения значения по умолчанию для параметра, задающего дату, когда должна быть возвращена книга (поле Absent.End_date). Это позволит в отдельных случаях предоставлять право пользования книгой менее 15 дней для дефицитных книг или более этого срока в исключительных случаях. Присвоим этому параметру имя par_End_date.
Тексты хранимых процедур в базе данных содержатся в системной таблице SYS.SYSPROCEDURE. Для получения текста процедуры Ins_absent необходимо выполнить следующие операторы:
//Получение текста хранимой процедуры SELECT SYSPROCEDURE.Proc_defn FROM SYS.SYSPROCEDURE /* Связь с другой таблицы если необходимо использовать имя владельца */ //KEY JOIN SYS.SYSUSERPERM WHERE SYSPROCEDURE.Proc_name
='Ins_absent' // Указание имени владельца при необходимости //AND User_name='Stepanov'; //оператор экспорта результатов оператора SELECT OUTPUT TO d:\Log_db\proctext.sql FORMAT ASCII
Загрузим в окно Command утилиты ISQL текст процедуры из файла d:\Log_db\proctext.sql. , выполнив команду меню File|Open. Отредактируем этот текст, заменив в нем название процедуры на Ins_absent_new и дополним состав формальных параметров параметром par_End_date. С учетом этого текст процедуры Ins_absent_new будет иметь вид:
//Создание процедуры с параметрами по умолчанию CREATE PROCEDURE Ins_absent_new /* Процедура, фиксирующая факт выдачи книги с инвентарным номером Par_N_books читателю, имеющим читальскую карточку, с номером Par_N_reader.Этот факт записывается в таблицу Absent. Владельцем таблицы Absent является пользователь Stepanov. В данной таблице дата выдачи книги (поле Beg_date) по умолчанию является текущая дата. Обычно книга выдается на 15 дней и на основании этого определяется дата ее возврата (поле End_date) по умолчанию. В случае необхо- димости книга может быть выдана на срок отличный от 15 дней путем использования фактического параметра Par_End_date */ ( IN Par_N_books SMALLINT, IN Par_N_reader SMALLINT, IN Par_End_date DATE DEFAULT current date+15 ) BEGIN INSERT INTO Stepanov.Absent (N_books, N_reader, End_date) VALUES( par_N_books, Par_N_reader, Par_End_date) END
После выполнения этого оператора в базу данных будет записана процедура Ins_absent_new. При обращении к этой процедуре в качестве фактических может использоваться два или три значения. Проверку этого факта автор предоставляет читателю.
Процедуры Ins_absent и Ins_absent_new могут быть созданы в одном сеансе ISQL. В этом случае для преобразования первой процедуры в вторую, текст процедуры Ins_absent может быть вызван для редактирования из списка ранее выполнявших последовательностей SQL-операторов () при помощи клавиш Ctrl+R.
В СУБД SQL Anywhere в процедурах может использоваться несколько параметров по умолчанию. В этом случае для указания какому именно из таких формальных параметров передаются значения фактических параметров используются имена соответствующих формальных параметров. Для иллюстрации этой возможности проведем редакцию процедуры Ins_absent_new:
// Модификация тела ранее созданной процедуры ALTER PROCEDURE Ins_absent_new /* ... */ ( IN Par_N_books SMALLINT, IN Par_N_reader SMALLINT DEFAULT 48, IN Par_End_date DATE DEFAULT Current date+15 ) BEGIN .............. END
ПРИМЕЧАНИЕ.
Для параметра Par_N_books нельзя задать значение по умолчанию. Это связано с тем, что параметр Par_N_books предназначен для указания значения поля Absent.N_books (). Данное поле содержит инвентарный номер выданной книги, который должен быть уникальным , так как один и тот же экземпляр книги не может быть выдан несколько раз. По этой причине для параметра Par_N_books недопустимо задание значения по умолчанию.
Процедуру Ins_absent_new можно вызвать несколькими способами, некоторые из которых имеют вид:
/* Примеры вызова процедуры с передачей параметров по умолчанию */ CALL Ins_absent_new(5) // значение пере- // дается только для пара- //метра par_N_books ; CALL Ins_absent_new(255, //через фактические параметры Par_End_date='1997-12-30') // передаются значение для или // параметров Par_N_books CALL Ins_absent_new( // и Par_End_date Par_N_books =255, // - Par_End_date='1997-12-30') //
Как было сказано ранее, хранимые процедуры записываются в базу данных, откуда они по мере необходимости могут быть удалены. Для удаления таких процедур из базы данных используется оператор DROP PROCEDURE. Например, для удаления процедуры Ins_absent этот оператор используется следующим образом:
//Удаление процедуры DROP PROCEDURE Ins_absent.
Пользователь, создавший хранимую процедуру, т.е. ее владелец, имеет доступ к данной процедуре без всяких ограничений. Он может вызывать процедуру на исполнение, модифицировать ее текст или просто удалить ее. Другим же пользователям привилегии на использование такой процедуры, и причем только в части ее вызова, осуществляется оператором GRANT ().
ПРИМЕЧАНИЕ.
Кроме владельца процедуры Х, все привилегии по отношению к ней имеют еще и пользователи, наделенные полномочиями администратора базы данных (класс полномочий DBA.). В дополнении к этому, такие пользователи могут при создании процедуры объявить ее владельцем любого другого пользователя.
Рассмотренная выше процедура Ins_absent была создана пользователем с именем Stepanov и предназначена для библиотекарей. В связи с этим возникает необходимость предоставления библиотекарям право вызова этой процедуры.
Как было сказано в приложении, все библиотекари объединены группу пользователей LIBRARIANS. Для того, чтобы члены этой группы получили возможность использовать процедуру Ins_absent следует выполнить оператор GRANT вида:
/* Предоставление полномочий на вызов хранимой процедуры */ GRANT EXECUTE ON Ins_absent TO LIBRARIANS
Лишение привилегий производится оператором REVOKE. В нашем случае это можно осуществит так:
/* Лишение полномочий на вызов хранимой процедуры */ REVOKE EXECUTE ON Ins_absent TO LIBRARIANS
Любая хранимая процедура всегда выполняется с привилегиями ее владельца. Это позволяет пользователям, не имеющим прямого доступа к таблицам данных, возможность обращения к этим таблицам через процедуры, которые они имеют право использовать. Для каждой таблицы хранимые процедуры представляет собой унифицированный механизм взаимодействия с ней. Это лишает пользователей сделать что-нибудь лишнее с таблицами данных и способствует поддержанию целостности данных.
использующая обработку курсора CREATE PROCEDURE
//Процедура, использующая обработку курсора CREATE PROCEDURE Count_publishers /* Процедура подсчитывает количество книг взятых, читателем "Петрова В.А.", которые изданы в издательстве "Советское радио" */ ( OUT Par_count_publishers SMALLINT ) BEGIN DECLARE Err_not_found //Декларируем EXCEPTION FOR //ситуацию выхода SQLSTATE '02000'; //за пределы курсора DECLARE N_Petrova SMALLINT; //№ читательской //карточки читателя "Петрова В.А." // Объявление переменных для хранения // значений полей текущей записи курсора DECLARE Tek_Author CHAR(20); DECLARE Tek_Title_book CHAR(100); DECLARE Tek_City_publish CHAR(15); DECLARE Tek_Publisher CHAR(20); DECLARE Tek_Year_publish SMALLINT; DECLARE //Объявление курсора Rez_cursor Rez_cursor // для результирующего множества, CURSOR FOR //формируемого процедурой CALL Get_list_absent(N_Petrova); SET //Обнуляем счетчик взятых книг Par_count_publishers = 0; /* Определяем № читательской карточки читателя Петровой В.А. */ SELECT Reader.N_reader INTO N_Petrova FROM Stepanov.Reader WHERE Reader.Name_reader = 'Петрова В.А.'; //Открываем курсор Rez_cursor с //результирующим множеством // процедуры Get_list_absent OPEN Rez_cursor; //Последовательно обрабытываем все //записи курсора Rez_cursor Work_for_kurs_loop: //метка цикла LOOP //Перемещаем указатель текущей записи //курсора на следующую запись. При этом //содержимое все полей записываются в //предназначенне для этого переменные FETCH NEXT Rez_cursor INTO Tek_Author, Tek_Title_book, Tek_City_publish, Tek_Publisher, Tek_Year_publish; IF SQLSTATE = Err_not_found THEN //В случае если произошел выход за //пределы курсора, то завершается //работа цикла Work_for_kurs_loop LEAVE Work_for_kurs_loop; END IF; IF Tek_Publisher = 'Советское радио' THEN SET Par_count_publishers= Par_count_publishers+1; END IF; END LOOP Work_for_kurs_loop; //конец цикла CLOSE Rez_cursor; END
Чтобы убедиться в правильной работе процедуры Count_publishers необходимо выполнить следующие SQL-операторы:
//Проверка работы процедуры Count_publishers //CREATE VARIABLE Rez SMALLINT; CALL Count_publishers(Rez); SELECT Rez
В результате вызова этой процедуры в переменную Rez записано значение один.
Несмотря на ограниченное применение процедуры Count_publishers, она представляет собой весьма наглядный пример обработки результирующего множества.
Таким образом, анализ возможностей хранимых процедур показал, что их использование как общего ресурса баз данных позволяет унифицировать обработку содержимого баз данных и повысить эффективность функционирования приложений.
Использование курсоров в хранимых процедурах
Одним из способов возврата результатов работы хранимых процедур является формирование результирующего множества. Данное множество формируется при выполнении оператора SELECT. Оно записывается во временную таблицу - курсор. Применение курсора в процедурах осуществляется путем последовательного выполнения следующих шагов:
По умолчанию курсор закрывается автоматически в конце транзакции (операторы COMMIT или ROLLBACK). Если при объявлении курсора указана фраза WITH HOLD (с сохранением), то курсор закрывается только явным образом оператором CLOSE. Такое использование курсора снимает все проблемы с остановкой функционирования процедур в среде утилиты ISQL, формирующих результирующие множества. В этом случае отпадает необходимость использования оператора RESUME.
В курсоре указатель может быть установлен:
В соответствие с приведенными шагами рассмотрим пример обработки результатов работы процедуры Get_list_absent. Для этого создадим в учебных целях процедуру Count_publishers, которая для читателя по фамилии "Петрова В.А.", имеющей читательскую карточку с № 80, определяет количество книг, изданных в издательстве "Советское радио". Текст этой процедуры приводится ниже:
Обработка исключительных ситуаций
При выполнении программных объектов пользователь должен иметь возможность оперативно реагировать на возникающие отклонения от нормального процесса их выполнения. Для решения этой задачи разработчики SQL Anywhere применили механизм обработки исключительных ситуаций. Данный механизм представляет собой прием, обеспечивающий перехват и обработку ошибок и предупреждений. Исключительные ситуации в SQL Anywhere возникают при выполнении SQL-операторов. Исключительные ситуации представляются в виде кодов возврата, которые формируются после завершения выполнения операторов. Коды возврата, как и в большинстве баз данных SQL, одновременно записываются в системные переменные SQLSTATE и SQLCODE. В этих переменных возникновение исключительных ситуаций кодируются по разному. Так в переменной SQLCODE они представляются в виде десятичных чисел. При этом отрицательные значения соответствуют ошибкам, положительные - предупреждениям, а ноль - успешному завершению оператора. Кодирование исключительных ситуаций в переменной SQLSTATE соответствует стандарту SQL/92. При этом коды возврата представляются в виде строк из пяти символов. В переменной SQLSTATE первые два символа составляют код класса ошибок, следующие три символа - код внутри класса. Код "00000" соответствует успешному выполнению оператора. Перечень кодов для переменных SQLSTATE и SQLCODE вы можете найти в документации SQL Anywhere или ее справочной системе. В зависимости от значений кодов возврата может быть принято решение о повторении оператора, прерывания функционирования приложения и т.д.
ПРИМЕЧАНИЕ.
После считывания значения одной из переменных SQLSTATE или SQLCODE, обе они приводятся в состояние отсутствия ошибок.
Рассмотрим сначала, что происходит с работой программных объектов при возникновении исключительных ситуаций в виде ошибок, когда обработка этих ошибок не предусмотрена. Обработка ошибок и поведение программных объектов при возникновении предупреждений рассмотрена п.п. , .
6.6.1. Работа программных объектов при отсутствии реакции на ошибки
Если при функционировании программного объекта возникает исключительная ситуаций в виде ошибки и их обработка нем не определена, то происходит следующее. Программный объект сразу прекращает свое функционирование и происходит передача управления вызвавшему его программному объекту. Туда же через переменные SQLSTATE и SQLCODE передается код возврата ошибки. Если и там не определена обработка возникшей ошибки, то происходит передача управления и кода возврата ошибки еще выше по иерархии вызовов. Такая передача происходит до тех пор пока не встретится программный объект, в котором предусмотрена обработка возникшей ошибки, или пока будет достигнут самый верхний уровень иерархии вызовов. В последнем случае произойдет аварийное завершение функционирования приложения.
Допустим, что ни в одном из программных объектов A, B и C не предусмотрена обработка ошибок. Допустим также, что для них имеется следующая динамика вызовов: A -> B ->C. Тогда при возникновении ошибки в C произойдет последовательное аварийное завершение функционирования программных объектов C,B и A , т.е. всего приложения в целом. Ниже приводится пример, демонстрирующий поведение программных объектов при отсутствии обработки ошибок. В данном примере процедура Proc_First вызывает Proc_Second , в которой возникает ошибка.
CREATE PROCEDURE Proc_First() BEGIN MESSAGE '===Работает Proc_First .'; CALL Proc_Second(); MESSAGE '=== SQLSTATE= ', SQLSTATE,' в Proc_First.' END //___конец___процедуры CREATE PROCEDURE Proc_Second() BEGIN /* Объявление исключительной ситуации colum_not_found -ошибка "поле не найдено" */ DECLARE colum_not_found EXCEPTION FOR SQLSTATE '52003'; MESSAGE '***Работает Proc_Second.'; /* Искусственно генерируем возникновение исключительной ситуации colum_not_found */ SIGNAL colum_not_found; MESSAGE '******* SQLSTATE= ', SQLSTATE,' в Proc_Second .' ; END //___конец___процедуры
Сделаем некоторые комментарии к процедурам Proc_Firsrt и Proc_Second. Оператор MESSAGE осуществляет выдачу в окно локального сервера () или окно Messages удаленного сервера () строку, формируемую из параметров оператора. Оператор DECLARE..EXCEPTION объявляет псевдоним для исключительной ситуации colum_not_found. Эта исключительная ситуация в процедуре Proc_Second вызывается искусственно. Для этой цели используется оператор SIGNAL. Для выполнения данного примера применим следующий оператор:
//Вызов процедуры CALL Proc_First(). Тогда в окне сервера получим следующие сообщения: ===Работает Proc_First ***Работает Proc_Second
Кроме того, на клиентской ЭВМ пользователю выдается сообщение colum not found.
В процедуре Proc_Second после выполнения оператора SIGNAL эмулируется исключительная ситуация. В связи с этим второе сообщение о значении переменной SQLSTATE из данной процедуры формироваться не будет. Дело в том, в что в этой процедуре не определена обработка ошибки colum not found. Поэтому после ее возникновения процедура сразу прекращает свое функционирование. Следовательно все операторы, следующие за оператором SIGNAL , в том числе и второй оператор MESSAGE, выполняться не будут.
После аварийного завершения процедуры Proc_Second управление передается процедуре Proc_First c выдачей кода возврата о ошибке colum_not_found. В этой процедуре также не предусмотрена обработка данной ошибки. По этой причине процедура Proc_First тоже аварийно завершает свое функционирование. При этом на экран клиентской ЭВМ, с которой была запущена процедура Proc_First, будет выдано сообщение о возникшей ошибке colum not found.
ПРИМЕЧАНИЕ
Определить оператор, при выполнении которого возникла ошибка, позволяет вызов в утилите ISQL функции Traceback(*).
6.6.2. Обработка ошибок в программных объектах
Рассмотрим как происходит обработка ошибок в программных объектах. Их обработка производится механизмом обработки исключительных ситуаций. Использование этого механизма состоит:
Покажем как применяются исключительные ситуации для обработки ошибок на примере процедур Proc_First_Ex и Proc_Second|_Ex. Эти процедуры представляют собой незначительные модификации процедур Proc_Firsrt и Proc_Second.
CREATE PROCEDURE Proc_First_Ex() BEGIN MESSAGE '===Работает Proc_First_Ex'; CALL Proc_Second_Ex(); MESSAGE '=== SQLSTATE= ', SQLSTATE, ' в Proc_First_Ex.' END //___конец___процедуры CREATE PROCEDURE Proc_Second_Ex() BEGIN /* Объявление исключительной ситуации colum_not_found - ошибка "поле не найдено)" */ DECLARE colum_not_found EXCEPTION FOR SQLSTATE '52003'; MESSAGE '***Работает Proc_Second_Ex .'; //искусственно генерируем возникновение // исключительной ситуации colum_not_found SIGNAL colum_not_found; MESSAGE 'Выполнен оператор SIGNAL'; EXCEPTION WHEN colum_not_found THEN MESSAGE '***Сolum_not_found', ' SQLSTATE= ', SQLSTATE; MESSAGE '***' SQLSTATE= ', SQLSTATE, ' в Proc_Second_Ex'; WHEN OTHERS THEN RESIGNAL; END //___конец___процедуры
После выполнения данного примера посредством оператора
//Вызов процедуры CALL Proc_First_Ex()
в окне сообщений сервера появится следующая информация:
===Работает Proc_First_Ex . ***Работает Proc_Second_Ex . ***Colum_not_found SQLSTATE= 52003 *** SQLSTATE= 00000 в Proc_Second_Ex === SQLSTATE= 00000 в Proc_First_Ex.
При использовании исключительных ситуации для обработки ошибок после возникновении последних происходит переход к блоку EXCEPTION. При этом операторы, следующие за ошибочным оператором не выполняются. В блоке EXCEPTION выполняется реакция на возникшую ошибку, если такая реакция определена. Если ошибка не определена, то в пределах этого блока осуществляется переход на метку OTHERS. В рассматриваемом примере в последнем случае должен выполняться оператор RESIGNAL. Он позволяет аварийно завершить процедуру, несмотря на наличие операторов обработки ошибок. Кроме того, данный оператор отменяет все действия совершенные в процедуре.
После выполнения соответствующих операторов в блоке EXCEPTION происходит завершение процедуры. При этот, если не используется оператор RESIGNAL, то в вызвавший программный объект передается код возврата об отсутствии ошибки (SQLSTATE='00000', SQLCODE=0).
Использование механизма исключительных ситуаций является удобным средством контроля за возникающими ошибками. При его применении от пользователя не требуется проверять коды возврата после каждого SQL-оператора. Эту функции берет на себя СУБД. Код программного объекта становится короче, нагляднее и, как правило, в нем уменьшается вероятность наличия ошибок.
6.6.3. Обработка предупреждений в программных объектах
Обработка предупреждений отличается от обработки ошибок. При формировании предупреждения в переменные SQLSTATE и SQLCODE также записывается код возврата. Но прерывания вычислительного процесса при этом не происходит и программный объект продолжает свое функционирование. Если возникает необходимость отреагировать на предупреждение, то достаточно проверить содержимое переменной SQLSTATE или SQLCODE.
Рассмотрим функционирование программных объектов в условиях формирования предупреждений на примере процедур Proc_Firsrt_W и Proc_Second_W. Они разработаны на базе процедур Proc_Firsrt и Proc_Second.
CREATE PROCEDURE Proc_First_W() BEGIN MESSAGE '===Работает Proc_First_w.'; CALL Proc_Second_W(); MESSAGE '=== SQLSTATE= ', SQLSTATE,' в Proc_First_W.' END //___конец___процедуры CREATE PROCEDURE Proc_Second_W() BEGIN /* Объявление исключительной ситуации row_not_found - предупреждение запись не найдена */ DECLARE row_not_found EXCEPTION FOR SQLSTATE '02000'; MESSAGE '***Работает Proc_Second_W .'; /* искусственно генерируем исключи- тельную ситуацию row_not_found */ SIGNAL row_not_found; IF sqlstate='02000' THEN MESSAGE '***Warning row_not_found', ' SQLSTATE= ', SQLSTATE; END IF ; MESSAGE '***SQLSTATE= ', SQLSTATE,' в Proc_Second_W .' ; END //___конец___процедуры
Запустив пример на исполнение оператором
//Вызов процедуры CALL Proc_First_W()
в окне сообщений сервера появится следующая информация:
===Работает Proc_First_w . ***Работает Proc_Second_W . ***row_not_found SQLSTATE= 02000 ***SQLSTATE= 00000 в Proc_Second_W . === SQLSTATE= 00000 в Proc_First_W.
Данный пример показывает, что управлять обработкой предупреждений казалось бы значительно проще, чем обработкой ошибок. Однако использование проверок после каждого SQL-оператора вызывает нагромождение вспомогательных конструкций в тексте программного объекта. Это никак не способствует снижению программных ошибок.
Программные объекты баз данных
Как и все СУБД, поддерживающие технологию "клиент-сервер", SYBASE SQL Anywhere наряду с данными хранит в базах данных программные объекты. Такими объектами являются: хранимые процедуры, хранимые функции и триггеры. Программные объекты могут использоваться большим количеством приложений. Такие объекты позволяют повысить эффективность функционирования приложений с базами данных, обеспечить высокую степень защиты последних и унифицировать способы обращения к данным из приложений.
Создание программных объектов заслуживает особого внимания и поэтому данный вопрос вынесен в отдельную главу.
В данной главе все примеры будут излагаться применительно к утилите ISQL. И только в конце главы будут проанализированы возможности SQL Central по работе с программными объектами.
При использовании ISQL необходимо удостовериться, что в данной утилите установлен режим завершения транзакции по окончанию работы с утилитой (). Это позволит проводить все действия с базой данных в виртуальной памяти сервера (), не изменяя содержимого базы данных на внешнем носителе. При этом имеется возможность отменить все изменения, проводимые в виртуальной памяти.
Работа с программными объектами в SQL Central
В п.п. 6.1 - 6.6 были рассмотрены основные принципы разработки программных объектов SYBASE SQL Anywhere с использованием утилиты ISQL. Теперь рассмотрим какой дополнительный сервис по разработке программных объектов предлагается пользователям в утилите SQL Central.
6.7.1. Формирование заготовок текстов процедур и функций
Как и в ISQL в утилите, в SQL Central содержательная часть каждого программного объекта формируется при помощи текстового редактора. Однако при этом утилита SQL Central предоставляет возможность использования заготовок текстов для новых программных объектов и удобный сервис по редактированию имеющихся программных объектов. Для хранимых процедур и функций такие заготовки предлагаются шаблонами Add Procedure(Template), Add Function(Template) и мастером Add Procedure/Function(Wizard). Все они являются элементами папки Procedures & Functions (рис. 77).

Рис.77. Содержимое папки Procedures & Functions
Как видно на рис. 77, в папке Procedures & Functions представлены вышеуказанные шаблоны и мастер вместе со всеми процедурами и функциями, использовавшимися в этой главе. Эти программные объекты были разработаны при написании текущей главы. На этом же рисунке отображено контекстное меню процедур, появляющееся в результате щелчка правой кнопкой мыши по пиктограмме любой процедуры или функции (это меню будет обсуждаться ниже). Двойной щелчок по такой пиктограмме левой кнопки мыши приводит к вызову текстового редактора утилиты с загруженным текстом выбранной процедуры в его окне.
В результате щелчка мыши по пиктограмме шаблона Add Procedure(Template) производится вызов текстового редактора. При этом окно текстового редактора содержит заготовку оператора CREATE PROCEDURE (рис. 78).

Рис.78. Окно текстового редактора утилиты SQL Central с заготовкой оператора CREATE PROCEDURE
В случае использования шаблона Add Function(Template) в текстовом редакторе автоматически формируется аналогичная заготовка для оператора CREATE FUNCTION.
Мастер Add Procedure/Function(Wizard) предлагает пользователю выполнить ряд шагов и создает более полную заготовку процедуры или функции. Рассмотрим эти шаги на примере. Для этого проанализируем как использовался мастер Add Procedure/Function(Wizard) при создании процедуры Get_list_absent, рассмотренной в .
Шаг 1. Начальная стадия создания хранимой процедуры/функции (рис. 79).

Рис.79. Создание новой хранимой процедуры или функции
Пояснение. Добро пожаловать в Мастер создания Процедур и Функций. Этот Мастер поможет вам в создании хранимой процедуры или функции. Процедуры и Функции представляют собой совокупности SQL-операторов и управляющих операторов, которые в дальнейшем транслируются для повышения эффективности функционирования.
Вопрос. Вы хотите создать хранимую процедуру или функцию?
Ниже приводится переключатель. Установка его в одно из двух положений позволяет ответить на поставленный вопрос.
После установки переключателя необходимо "нажать" на кнопку Далее для выполнения следующего шага.
В нашем случае для создания процедуры было выбрано положение Stored Procedure (no return value).
Шаг 2. Определение названия процедуры и ее владельца (рис. 80).

Рис.80. Определение названия процедуры и ее владельца
Вопрос 1. Как будет называться новая процедура?
Находящееся ниже поле предназначено для имени создаваемой процедуры. Введем в это поле строку Get_list_absent.
Вопрос 2. Кто из пользователей будет владельцем процедуры?
В приводимом поле отображается имя владельца новой процедуры. По умолчанию это пользователь создающий ее.
Пользователи, обладающие правами администратора базы данных, имеют возможность назначить владельцем процедуры любого пользователя. Для этого они могут воспользоваться кнопкой Change.
Ответив на оба вопроса, при помощи кнопки Далее осуществляется переход к очередному шагу.
В нашем случае в качестве владельца был определен пользователь Stepanov.
Шаг 3. Выбор диалекта языка SQL для создаваемой процедуры (рис. 81).

Рис.81. Выбор диалекта языка SQL для создаваемой процедуры
Вопрос 1. Какой из диалектов языка SQL будет использоваться для создания новой процедуры?
Для ответа на этот вопрос пользователю предлагается установить переключатель в одно из положений Transact_SQL (compatible with Sybase SQL Server) или Watcom-SQL (SQL Anywhere native dialect).
В п.1 говорилось, что SYBASE SQL Anywhere максимально, насколько это возможно для СУБД такого класса, совместима с SYBASE SQL Server. Одной из сторон такой совместимости является поддержка в SYBASE SQL Anywhere такого диалекта языка SQL как Transact-SQL. Этот диалект используется в SYBASE SQL Server и может применяться в SYBASE SQL Anywhere наряду с собственным диалектом языка SQL - Watcom-SQL. Эти диалекты во многом совместимы, что схематично на рис. 82.

Рис.82. Совместимость Watcom-SQL и Transact-SQL
Вопрос 2. Вы можете возвращать в качестве результата более чем одну запись, используя результирующее множество. Вы хотите использовать такое множество?
Флажок Include result set () позволяет ответить на этот вопрос.
Выбрав диалекта языка SQL и установив признак необходимости использования результирующего множества, можно приступать к следующему шагу
При создании процедуры Get_list_absent был выбран Watcom-SQL. В создаваемой процедуре результирующее множество необходимо. По этой причине был установлен флажок Include result set.
Шаг 4. Включение оператора SELECT, формирующего результирующее множество в текст создаваемой процедуры (рис. 83).

Рис.83. Включение оператора SELECT, формирующего результирующее множество в текст создаваемой процедуры
Пояснение. Если вам известен оператор SELECT, который в дальнейшем будет использоваться в процедуре для формирования результирующего множества, то вы можете ввести его текст здесь. В результате этого мастер автоматически сгенерирует текст описания результирующего множества (фраза RESULT). Если вы этого не знаете, то можете просто нажать на кнопку Далее и определить результирующее множество вручную в текстовом редакторе.
Для ввода текста оператора SELECT ниже приводится поле окна. Для перехода к завершающему шагу следует "нажать" на кнопку Далее.
На рис. 83 в этом окне представлен такой оператор, примененный в процедуре Get_list_absent.
Шаг 5. Подтверждение готовности к созданию новой процедуры (рис. 84).

Рис.84. Подтверждение готовности к созданию новой процедуры
Пояснение 1. Вы можете включить комментарий для новой процедуры.
Ниже располагается поле для ввода комментария для создаваемой процедуры.
Пояснение 2. Мастер сгенерирует заготовку для следующей процедуры:
| Название: | Get_list_absent |
| Владелец | Stepanov |
| Диалект SQL: | Watcom-SQL |
| Использование результирующего множества: | Да |
После "нажатия" на эту кнопку мастер сформирует заготовку процедуры и отобразит ее в окне текстового редактора утилиты.
При создании процедуры Get_list_absent была получена заготовка, представленная на рис. 85.

Рис.85. Заготовка процедуры Get_list_absent
Процедура Get_list_absent состоит всего из одного оператора SELECT, определенного при выполнении шага 4. По этой причине в данном случае фактически была получена почти готовая процедура. В нее следует добавить описание входного параметра Par_N_reader и дополнить комментариями (). В общем случае, процедура, как правило, содержит несколько SQL-операторов. В связи с этим для формирования окончательного текста процедуры может потребоваться значительная доработка.
В случае использования мастера Add Procedure/Function(Wizard) для разработки функции, он формирует заготовку примерно такого же уровня как для процедуры.
6.7.2. Формирование заготовок текстов триггеров
Утилита SQL Central предоставляет сервис по формированию заготовок не только для процедур и функций, но и для триггеров. Для формирования заготовок триггеров используется мастер Add Trigger, являющийся элементом папки Triggers (рис. 86).

Рис.86. Содержимое папки Triggers
Как видно на рис. 86 в папке Triggers содержатся еще все имеющиеся для текущей таблицы триггеры (в данном случае для таблицы Books). Здесь же отображено контекстное меню триггеров, появляющееся в результате щелчка правой кнопкой мыши по пиктограмме любого триггера (это меню будет обсуждаться ниже). Двойной щелчок по такой пиктограмме левой кнопки мыши приводит к вызову текстового редактора утилиты с загруженным текстом выбранного триггера в его окне.
Рассмотрим как использовался мастер Add Trigger для формирования заготовки триггера Add_copies (). Мастер предлагает Add Trigger выполнить ряд шагов, которые представлены ниже.
Шаг 1. Начальная стадия создания триггера (рис. 87).

Рис.87. Создание нового триггера
Пояснение. Добро пожаловать в Мастер создания Триггеров. Этот Мастер позволит вам разработать триггер для текущей таблицы.
В SQL Anywhere пользовательские триггеры используются для реализации сложный форм ссылочной целостности.
Вопрос. Как будет называться новый триггер?
В имеющемся ниже поле окна необходимо ввести название триггера и затем при помощи кнопки Далее перейти к выполнению следующего шага.
В нашем случае было указано название Add_copies.
Шаг 2. Определение событий, на которые должен реагировать триггер (рис. 88).

Рис.88. Определение событий, на которые должен реагировать триггер
Вопрос. Какое из событий должно вызвать активизацию триггера?
Для ответа на этот вопрос мастер предлагает установить флажки соответствующие событиям, на возникновение которых может реагировать триггер. При использовании события UPDATE OF мастер предоставляет возможность указать модификация каких полей вызовет активизацию триггера. Выбор одного или нескольких событий и использование кнопки Далее является условием продолжения дальнейшего использования мастера.
При создании триггера Add_copies было определено, что причиной его активизации должно быть добавление новых записей в таблицу (событие INSERT).
Шаг 3. Выбор уровня триггера (рис. 89).

Рис.89. Выбор уровня триггера
Пояснение. Строчный триггер (триггер уровня Row-level trigger) может быть определен для выполнения до или после добавления, модификации или удаления каждой записи. Операторный триггер (триггер уровня Statement-level trigger) выполняется после завершения всего оператора.
Вопрос. Триггер какого уровня вы хотите создать?
Расположенный ниже переключать позволяет сделать требуемый выбор и затем приступить к следующему шагу.
Триггер Add_copies был определен как строчный триггер.
Шаг 4. Определение времени и порядка активизации триггера (рис. 90).

Рис.90. Определение времени и порядка активизации триггера
Вопрос 1. Когда должна производиться активизация триггера?
Переключатель ниже позволяет указать, что триггер может активизироваться до или после возникновения события.
Пояснение. Если для одного и того же события определено несколько триггеров, то для данного триггере вы можете указать очередность его активизации.
Вопрос 2. Каким по очереди должен активизироваться триггер?
Расположенный ниже счетчик, позволяет ответить на этот вопрос. Для перехода к завершающему шагу следует "нажать" на кнопку Далее.
Триггер Add_copies был определен как предваряющий триггер, который должен активизироваться в первую очередь.
Шаг 5. Подтверждение готовности к созданию нового триггера(рис. 91).

Рис.91. Подтверждение готовности к созданию нового триггера
Пояснение 1. Вы можете включить комментарий для нового триггера.
Ниже располагается поле для ввода комментария для создаваемого триггера.
Пояснение 2. Мастер сгенерирует заготовку для следующего триггера:
| Add_copies | |
| Событие, активизи-рующее триггер: | INSERT |
| Время активизации: | До выполнения оператора |
| Уровень триггера: | Строчный триггер |
После "нажатия" на эту кнопку мастер сформирует заготовку триггера и отобразит ее в окне текстового редактора утилиты.
При создании триггера Add_copies была получена заготовка, представленная на рис. 92.

Рис.92. Заготовка триггера Add_copies
Полученная заготовка содержит обязательные элементы оператора CREATE TRIGGER, необходимые для создания предваряющего строчного триггера Add_copies. Необязательные элементы этого оператора заключены в квадратные скобки. Теперь осталось отредактировать текст заготовки для получения окончательного текста триггера.
6.7.3. Контекстные меню программных объектов
При щелчке правой кнопки мыши по любому объекту в SQL Central появляется контекстное меню. Не является исключением и программные объекты. Вид их представлен на рис. 77 и 86. Контекстные меню триггеров и процедур во многом совпадают и реакция на выбор их одноименных пунктов одинакова. Только в первом случае объектом воздействия являются триггеры, а во втором - процедуры и функции. Меню процедур имеет более широкий состав пунктов и его изучение позволит без проблем использовать контекстное меню триггеров. По этим причинам предметом дальнейшего обсуждения является только контекстное меню процедур. Такое меню включает в себя пункты Open, Open as Watcom-SQL, Open as Transact-SQL, Test in ISQL, Copy, Paste, Delete и Properties. (). Рассмотрим назначение этих пунктов.
Пункт Open предназначен для вызова текстового редактора с тестом текущей процедуры. При этом текст процедуры отображается на том диалекте SQL, на котором он создавался. Ранее уже отмечалось, что программные объекты могут разрабатываться на любом из диалектов SQL, поддерживаемые SYBASE SQL Anywhere (Watcom-SQL или Transact-SQL).
Выбор пунктов Open as Watcom-SQL или Open as Transact-SQL позволяет отображать процедуру в требуемом диалекте языка SQL, вне зависимости от того какой диалект использовался при создании процедуры. Как выглядит на языке Transact-SQL рассмотренная в процедура Get_list_absent приведено на рис. 93.

Рис.93. Процедура Get_list_absent на языке Transact-SQL
Если сравнить текст процедуры Get_list_absent на обоих диалектах, то можно отметить всего два отличия. Одно состоит в служебном слове AS, находящемся перед служебным слово BEGIN на диалекте Transact-SQL., второе - в замене при описании параметра процедуры служебного слова IN на символ @. В других случаях различия могут быть более существенными, но в конечном итоге не очень значительными ().
Пункт Test in ISQL служит для организации процесса тестирования. Реакцией на его выбор является запуск утилиты ISQL, если она еще не работает. При этом в ее окне Command формируются необходимые подготовительные операторы и оператор вызова процедуры с требуемыми параметрами. К вспомогательным операторам относятся операторы CREATE VARIABLE (создание переменных) , SET (присваивание), RESUME ALL (завершение всех процедур, использующих результирующее множество - см. ) и ряд других. Использование пункта Test in ISQL для процедуры Get_list_absent вызывает формирование следующей последовательности SQL-операторов, в которую вставлен перевод комментариев:
% % % SQL Central generated procedure test script % % % Ensure any previously executing procedures are completed /* SQL Central сгенерировал процедуру тестиро- вания программного объекта. Обеспечиваем завер- шение выполнения всех запущенных процедур */ RESUME ALL; % % % Ensure our test variables do not already exist /* Предотвращаем ситуацию повторного объявления переменной, используемой в тесте */ SET OPTION On_error = 'continue'; DROP VARIABLE "Par_N_reader"; SET OPTION On_error = 'prompt'; % % % Create input/output variables /*Описание переменных */ CREATE VARIABLE "Par_N_reader" smallint; % % % Edit the following lines to set the input values /* Отредактируйте следующие строки для присвоения значений пременным */ SET "Par_N_reader" = '1'; % % % Execute the procedure /* Выполнение процедуры */ CALL "Stepanov"."Get_list_absent"( "Par_N_reader" ); % % Use the RESUME command to view multiple result sets /* Используйте оператор RESUME для просмотра нескольких результирующих множеств */
Данные SQL-операторы отображаются в окно Command утилиты ISQL (). В случае необходимости эти операторы могут быть отредактированы и запущены на исполнение.
Выбор пункта Copy позволяет запомнить в системном буфере текст выбранной процедуры/функции с целью ее копирования в другую базу данных. Для этого требуется в текущем сеансе работы утилиты SQL Central осуществить соединение с другой базой данных. Затем для новой базы данных необходимо отобразить в правой панели содержимое папки Procedures & Functions. После этого следует щелкнуть в любом свободном месте правой панели правой кнопкой мыши и выбрать в появляющемся контекстном меню пункт Paste. В результате этого на основании данных системного буфера создается копия процедуры первой базы данных.
Пункт Delete предназначен для удаления процедур и функций.
Особого внимания заслуживает пункт меню Properties. Его выбор выводит на экран окно свойств процедуры (рис. 94).

Рис.94. Вкладка General окна свойств процедуры
Это окно содержит две вкладки General и Permissions. Первая из них представлена на рис. 94. В ней содержится общая информация процедуре: название, владелец, использовавшийся диалект языка SQL и комментарий. Вкладка Permissions предназначена для установки привилегии EXECUTE для процедуры (рис. 95).

Рис.95. Вкладка Permissions окна свойств процедуры
В этом окне видно, что группе пользователей LIBRARIANS предоставлено право использовать процедуру Get_list_absent. Установка такого права (привилегии EXECUTE) осуществляется при помощи кнопки Grant Execute. Кнопка Revoke Execute предназначена для лишения этого права. Такие же действия, но только применительно к таблицам рассмотрены в п.5.6 (см. рис. ).
Таким образом, анализ программных объектов SYBASE SQL Anywhere показал, что их использование позволяет реализовать сложные формы ограничений целостности и существенно расширить функциональные возможности разрабатываемых приложений баз данных.
Результаты выполнения процедуры Get_list_absent(80)
| Гмурман В.Е. | Теория вероятностей и математическая статистика.Учебное пособие для студентов ВТУЗов | Москва | Высшая школа | 1972 |
| Гмурман В.Е. | Руководство к решению задач по теории вероятностей и математической статистике.Учебное пошкола пособие для студентов ВТУЗов | Москва | Высшая школа | 1979 |
| Дектярев Ю.И. | Методы оптимизации | Москва | Советское радио | 1980 |
| Габасов Р. | Методы оптимизации | Минск | БГУ | 1981 |
При выполнении процедуры, формирующей результирующее множество, создается временная таблица - курсор (CURSOR). В курсор записывается результирующее множество. В дальнейшем пользователь может обрабатывать данные курсора по-своему усмотрению. Это будет обсуждаться в следующем п.5.3.
ПРИМЕЧАНИЕ
Следует обратить особое внимание на использование оператора RESUME в связи с результирующим множеством. Он продолжает выполнение процедурыв среде утилиты ISQL в связи с ее обязательной остановкой после формирования такого множества.
В среде утилиты ISQL процедура работает до своего нормального или аварийного завершения или до тех пор, пока не будет сформировано результирующее множество. Последнее возможно только, если для этого множества при помощи оператора OPEN не был открыт курсор.
Допустим, что процедура приостановила свое функционирование после формирования результирующего множества, и при этом не применялся оператор OPEN. Тогда процедура будет находиться в "зависшем" состоянии на сервере до тех пор, пока не будет выполнен оператор RESUME. Данный оператор закрывает курсор и продолжает работу процедуру до ее завершения или до формирования следующего результирующего множества.
Исходя из этого, следует отметить, что выполнение процедуры Get_list_absent не завершено. Она все еще находится в "зависшем" состоянии на сервере. Для ее завершения выполните оператор RESUME.
Покажем использование оператора RESUME на примере процедуры For_RESUME:
// Процедура, использующая несколько // результирующих множеств CREATE PROCEDURE For_RESUME () /* Демонстрация оператора RESUME. При каждом вызове процедуры Get_list_absent формируется ре- зультирующее множество и процедура For_RESUME приостанавливает свою работу. Требуется выполнить оператор RESUME для продолжения работы. Таким образом для завершения процедуры For_RESUME необходимо выполнить три оператора RESUME */ BEGIN MESSAGE '_______Parameter =80'; CALL Get_list_absent (80); /*остановка до выполнения оператора RESUME */ MESSAGE '____ Parameter =60'; SELECT B.Author, B.Title_book, B.City_publish, B.Publisher, B.Year_publish FROM Stepanov.Books B WHERE B.Code_book = 60; /*остановка до выполнения оператора RESUME */ MESSAGE '_ Parameter =40'; CALL Get_list_absent (40); /*остановка до выполнения оператора RESUME */ MESSAGE '****FINISH'; END //завершение работы процедуры
После вызова процедуры For_RESUME в утилите ISQL:
После выполнения оператора RESUME функционирование процедуры For_RESUME будет продолжено до тех пока не будет сформировано следующее результирующее множество. В данном случае это сделает оператор SELECT.
В случае необходимости процедура завершения работы процедуры до конца следует воспользоваться оператором RESUME ALL. При этом кроме текущей завершаются также все процедуры формирующие результирующие множества, которые находятся в "подвешенном" состоянии на сервере.
После выполнения оператора SELECT происходит следующее:
После выполнения оператора RESUME функционирование процедуры For_RESUME будет продолжено до следующего результирующее множество.
После его анализа выполним последний третий раз оператор RESUME. В результате этого получим:
ПРИМЕЧАНИЕ
Если в процедуре результирующее множество формируется несколько раз, например, как в процедуре For_RESUME, то число полей результирующего множества и их типы должны для каждого множества быть одни и теми же.
Таким образом, рассмотренные разнообразные способы получения результатов функционирования хранимых процедур придают гибкость процессу разработки приложений баз данных.
Назначение псевдонимов, вводимых фразой
REFERENCING для обращения к исходным и обновленным записям при определении триггеров
| Строчный | Предваряющий | NEW AS | Для обращения к полям вводимой записи | -- | Для обращения к новым значениям модифицируемых полей записи |
| OLD AS | -- | Для обращения к полям удаляемой записи | Для обращения к исходным значениям модифицируемых полей записи | ||
| Завершающий | NEW AS | Для обращения к полям введенной записи | -- | Для обращения к новым значениям модифицируемых полей записи | |
| OLD AS | -- | Для обращения к полям удаленной записи | Для обращения к исходным значениям модифицируемых полей записи | ||
| Операторный | Завершающий | NEW AS | Для обращения к времненой таблице, содержащей введенные записи | -- | Для обращения к временной таблице,содержащей модифицированные записи |
| OLD AS | -- | Для обращения к временной таблице, содержащей удаленные записи | Для обращения к временной таблице, содержащей исходные значения обновленных записей |
ПРИМЕЧАНИЕ
При активизации операторного триггера создаются одна или две временные таблицы. В этих таблицах хранятся записи, добавленные к исходной таблицы данных, удаленные из нее или записи, подвергнувшиеся изменениям, до и после выполнения оператора UPDATE.
Для завершения обсуждения псевдонимов, используемых в триггерах, приведем еще один пример триггера:
//Демонстрация псевдонимов триггера CREATE TRIGGER Update_Number /* Строчный завершающий триггер, выдающий при модификации поля Number старое и новое его значения */ AFTER UPDATE OF Number ON Stepanov.Books REFERENCING OLD AS Old_books NEW AS New_books FOR EACH ROW BEGIN MESSAGE '*** UPDATE ****'; MESSAGE 'OLD NUMBER=', Old_books.number; MESSAGE 'NEW NUMBER=', New_books.number; END
Строчный завершающий триггер Update_Number, активизируется при модификации поля Stepanov.Books.Number. В процессе своей работы он выдает на сервер старое и новое значение этого поля. Для проверки его работы выполним следующей SQL-оператор:
//Проверка триггера Update_Number UPDATE Stepanov.Books SET Number=7 WHERE Code_book=1
В результате в окне сервера будет выдано следующее сообщение:
*** UPDATE **** OLD NUMBER=49 NEW NUMBER=7
После этого выполним оператор ROLLBACK для отмены проведенной модификации таблицы Stepanov.Books.
Рассмотрим теперь пример операторного триггера. Определим его снова для таблицы Stepanov.Books и опять для события Добавление новой записи. Для данной таблицы на это событие уже настроен один триггер - Add_copies. Поэтому для задания очередности выполнения триггеров установим, чтобы новый триггер запускался во вторую очередь (фраза ORDER 2). В данном случае иначе и нельзя, так как триггер Add_copies - это предваряющий триггер, а новый триггер - завершающий. Назовем новый триггер Copies_Books. Текст его представлен ниже:
// Создание операторного триггера CREATE TRIGGER Copies_Books AFTER INSERT ORDER 2 ON Stepanov.Books FOR EACH STATEMENT /* Операторный завершающий триггер сранивает число экземпляров книг зафиксированных в таблицах Stepanov.Books и Stepanov.Copies. Если эти данные не совпадают, то значит нарушена целостность данных. В этом случае искусственно генерируется ошибка с кодом SQLSTATE '99999' */ BEGIN DECLARE Err_referencins EXCEPTION FOR SQLSTATE '99999'; DECLARE Count_copies SMALLINT; DECLARE Sum_copies SMALLINT; //Определяем число книг в библиотеке, //используя таблицу Stepanov.Copies SELECT COUNT(*) INTO Count_copies FROM Stepanov.Copies; //Определяем число книг в библиотеке, //используя таблицу Stepanov.Books SELECT SUM(Books.Number) INTO Sum_copies FROM Stepanov.Books; //Сравниваем результаты подсчетов IF Count_copies <> Sum_copies THEN MESSAGE 'Err_referencins'; SIGNAL Err_referencins; END IF; END
В данном триггере нет обращений отдельно к вновь введенным записям таблицы Stepanov.Books, обращение происходит целиком к таблице. По этой причине фраза REFERENCING в триггере не используется. Рассматриваемый триггер представляет собой еще один пример механизма поддержания сложных форм ограничений целостности данных. Оба триггера взаимно дополняют друг друга. Предваряющий строчный триггер Add_copies согласованно добавляет записи в таблицы Stepanov.Copies и Stepanov.Books. Завершающий операторный триггер Copies_Books проверяет согласованность содержимого этих таблиц.
Действия, реализуемые в этом триггере и в триггере Add_copies, не могут быть реализованы стандартными механизмами поддержания ссылочной целостности. Это является наглядным примером того какое мощное средство поддержания целостности данных представляют собой триггеры.
По аналогии с ранее рассмотренными программными объектами - хранимыми процедурами и функциями, любой триггер содержится в базе данных. Там он хранится до тех пор пока не будет удален из нее посредством оператора DROP TRIGGER. Таким образом для удаления триггера Add_copies этот оператор должен быть использован так:
//Удаление триггера DROP TRIGGER Add_copies.
Триггеры всегда выполняются с полномочиями владельца таблицы, с которой связаны триггеры. Привилегии пользователя, активизировавшего триггер, или пользователя, создавшего триггер, на выполнение самого триггера не оказывают никакого влияния. Допустим, что библиотекари не имеют вообще никаких привилегий на использование таблиц Stepanov.Copies и Stepanov.Books. Однако они имеют право вызывать процедуру Ins_absent, которая осуществляет пополнение состава записей таблицы Stepanov.Books. Тогда библиотекари при обращении к процедуре Ins_absent, добавляющей новые записи в таблицу Stepanov.Books, активизируется триггер Add_copies. Этот триггер выполняется с привилегиями пользователя Stepanov. - владельца таблицы Stepanov.Copies. Следовательно этот триггер имеет возможность вводить новые записи в эту таблицу. В связи с этим библиотекари, не имея право работать с таблицей Stepanov.Copies-напрямую, тем не менее имеют возможность взаимодействовать с этой таблицей косвенно. Данное свойство позволяет разработать для пользователей единый способ манипулирования с конкретной таблицей, что служит еще одним средством поддержания целостности данных.
Таким образом, исходя из сказанного, следует, что триггеры являются мощным средством обеспечения сложных форм ограничений целостности данных.
Триггеры
Триггеры - это один из видов программных объектов СУБД, поддерживаемых SQL Anywhere. Каждый триггер связан с одной из таблиц данных, входящих состав базы данных. С каждой такой таблицей может быть связано несколько триггеров. Основное назначение триггеров состоит в автоматическом использовании их в качестве реакции на некоторые события, происходящие с таблицами, с которыми связанны триггеры. Это свойство триггеров позволяет использовать их для реализации сложных форм ограничений целостности данных. Кроме того, рассматриваемое свойство превращает сервер из пассивного наблюдателя за происходящими изменениями данных в систему, оперативно реагирующую на такие изменения. Правила, в соответствие с которыми осуществляются активные действия сервера, определяются триггерами. Иногда эти правила или сами триггеры называют бизнес - правилами .
Триггеры, создаются оператором CREATE TRIGGER. Модификация триггеров производится при помощи оператора ALTER TRIGGER, а удаление - оператором DROP TRIGGER. Эти операторы могут использовать:
ПРИМЕЧАНИЕ
Независимо от того, кто создал триггер его владельцем всегда является владелец таблицы.
В СУБД SQL Anywhere триггеры могут быть определены для одного из приведенных ниже событий или сразу на несколько из них:
Таким образом, триггеры автоматически запускаются при изменении содержимого таблицы данных, с которой они связаны.
Для каждого триггера должно быть определено время его выполнения - либо перед операторами INSERT, DELETE, UPDATE (предваряющий триггер), либо после них (завершающий триггер). Типичный пример использования предваряющих триггеров - проверка вводимых данных. Завершающие триггеры полезны в тех случаях, когда при модификации записей необходимо сравнивать исходные значения полей с их новыми значениями.
Операторы INSERT, DELETE, UPDATE, которые содержат служебное слово WHERE или подзапросы, как правило, воздействуют (добавляют, удаляют, модифицируют) на несколько записей таблицы. Когда при этом должен выполняться триггер? Каждый раз при изменение очередной записи или один раз после модификации всех записей? Для ответа на этот вопрос в SQL Anywhere реализованы триггеры двух уровней. Триггер первого уровня Statement-level trigger выполняется однократного после полного завершения одного из вышеуказанных операторов (операторный триггер) Триггер второго уровня Row-level trigger предназначен для многократного выполнения после каждого изменения одной из записей (строк) таблицы (строчный триггер).
Если при выполнении триггера возникает ошибка, тогда все действия осуществленные оператором, активизировавшим триггер, и действия, уже произведенные самим триггером, отменяются. В результате этого база данных возвращается в состояние, предшествующее началу выполнения вышеуказанного оператора.
ПРИМЕЧАНИЕ
Следует особо подчеркнуть, что триггеры активизируются только при выполнении операторов INSERT, DELETE, UPDATE и никаких других. Данное обстоятельство необходимо отметить в связи со следующим. Как показал опрос ряда пользователей, многие из них ошибочно считают, что триггеры активизируются и при добавлении новых записей в таблицы в результате импорте данных. Однако импорт производится операторами INPUT и LOAD TABLE, который не входят в число вышеуказанных операторов. В связи с этим, при осуществлении импорта данных механизм триггеров не работает.
Рассмотрим пример использования триггера. В предметной области - в библиотеке, для которой разрабатывается приложение, вполне типична следующая ситуация. В библиотеку периодически поступают новые книги. Каждую из них необходимо учесть и завести карточки для всех ее экземпляров. Применительно к следует для каждой книги добавить одну запись в таблицу Stepanov.Books и несколько записей (по числу экземпляров) в таблицу Stepanov.Copies. Для реализации этих действий следует выполнить операторы INSERT для обеих вышеуказанных таблиц. Если один из таких операторов не выполнить, то произойдет нарушение целостности базы данных. Такое требование должно соблюдаться для всех приложений (допустим их несколько), производящих регистрацию поступления новых книг. В этом случае хорошим решением является применение для таблицы Stepanov.Books триггера, реагирующего на выполнение оператора INSERT. Как и таблица, этот триггер будет в храниться в база данных и можно обеспечить доступ к нему всем приложениям. Тогда один и то же механизм поддержания целостности будет использоваться для всех таких приложений. При изменении механизма (изменении тела триггера), этот факт станет "достоянием гласности" для всех приложений. Реализация механизма поддержания целостности базы данных при пополнения библиотечного фонда представлен в виде триггера Add_copies:
//Определение триггера CREATE TRIGGER Add_copies BEFORE INSERT ORDER 1 ON Stepanov.Books REFERENCING NEW AS New_books FOR EACH ROW /* Предваряющий строчный триггер, активизирую- щийся при наступлении события "Добавление новой записи" в таблицу Stepanov.Books. В этой таблице имеются три поля, для двух из которых определены значения по умолчанию. Поэтому в операторе INSERT достаточно ввести значения только одного поля - Code_book */ BEGIN DECLARE Kol SMALLINT; SET Kol=New_books.number; /* MESSAGE 'Code_book=', New_books.Code_book; */ WHILE Kol>0 LOOP INSERT INTO Stepanov.Copies( Code_book) VALUES( New_books.Code_book); SET Kol=Kol-1 END LOOP END
Триггер Add_copies является предваряющим строчным триггером, о чем указывают служебные слова BEFORE и FOR EACH ROW, соответственно. Данный триггер активизируется при добавлении новой записи (служебное слово INSERT) в таблицу (служебное слово ON) Stepanov.Copies. Триггер Add_copies формирует данные об экземплярах поступившей книги путем добавления новых записей о каждом экземпляре книги в таблицу Stepanov.Copies. В рассматриваемом случае процесс использования этого триггера происходит следующим образом. Данный триггер активизируется при выполнении оператора INSERT. Этот оператор позволяет вставлять сразу несколько записей. Каждый раз перед добавлением очередной записи запускается триггер и после его успешного выполнения производится непосредственное добавление следующей записи в таблицу Stepanov.Books. Далее при попытке вставить еще одну запись происходит повторная активизация триггера, а затем добавление этой записи в таблицу. Так происходит до тех пор пока не завершится выполнение оператор INSERT. Другим условием завершением этого оператора является возникновения ошибки при выполнении самого оператора или триггера. В этом случае происходит аварийное завершение оператора и база данных возвращается в состояние, в котором она была до начала выполнения оператора.
Общий порядок применения триггеров состоит в последовательном выполнении следующих шагов при вызове на выполнение операторов INSERT, DELETE или UPDATE:
Теперь детально проанализируем триггер Add_copies. Как уже было сказано ранее, с одной таблицей может быть связано несколько триггеров. Некоторые из них могут быть настроены на одни и те же события. Для того, чтобы в этом случае установить порядок их выполнения применяется служебное слово ORDER. Для других случаев его применение является не обязательным. В триггере Add_copies это слово используется для указания того, что данный триггер будет выполняться первым при наступлении события Добавление новой записи в таблицу. Это сделано в связи с тем, что далее для этого события будет предложен еще один триггер.
Проверим функционирование триггера Add_copies. Для этого сымитируем факт поступления в библиотеку новой книги:
//Имитация поступления в библиотеку новой книги INSERT Stepanov.Books (Author, Coauthors, Title_book, City_publish, Publisher, Year_publish, Number) VALUES ('Степанов Ю.Л.', 'Карпова Т.С., Гурко А.В.', 'ЭФФЕКТИВНАЯ РАБОТА С БАЗАМИ ДАННЫХ ПО ТЕХНОЛОГИИ КЛИЕНТ-СЕРВЕР', 'Санкт-Петербург','ПИТЕР', 1998, 10)
Данный триггер при попытке добавления новой записи в таблицу Stepanov.Books сначала осуществляет вставку записи в таблицу Stepanov.Copies. Далее производится контроль ограничений целостности. При этом стоит напомнить, что в таблице Stepanov.Copies определен внешний ключ Books_Copies, который ссылается на таблицу Stepanov.Books. Создание этого внешнего ключа , но только для базы данных Dubl_Biblia обсуждалось в п.5.8.
Одним из основных назначений внешних ключей является предотвращение "висячих" ссылок. Однако при использовании триггера Add_copies сначала создаются именно такие ссылки. Это связано с тем, что в таблицу Stepanov.Copies будет добавлена запись с информацией об первом экземпляре i-ой книги, а данных о самой книге в таблице Stepanov.Books еще нет. В связи с этих внешний ключ Books_Copies ссылается на не существующую запись таблицы Stepanov.Books. Результатом этого является возврат базы данных в исходное состояние (состояние до начала выполнения оператора INSERT) и выдача сообщения о возникновении исключительной ситуации "no primary key value for foreign key 'Book_Copies' in table 'Copies'". Оно означает отсутствие значения первичного ключа для внешнего ключа Books_Copies таблицы Copies.
Таким образом, условием наступления данной исключительной ситуации является наличие предваряющего триггера. Другим условием является то, что во внешнем ключе Books_Copies определена проверка ограничений целостности сразу после изменения содержимого таблицы данных. Выходом из создавшегося положения может быть одна из двух альтернатив:
Использовании первой альтернативы заключается в замене в тексте тела триггера служебного слова BEFORE на AFTER. Тогда первая строчка в определении триггера Add_copies будет выглядеть следующим образом:
/* Преобразование предваряющего триггера в завершающий */ ALTER TRIGGER Add_copies AFTER.
Тексты триггеров в базе данных содержатся в системном представлении SYS.SYSTRIGGERS. Для получения текста триггера Add_copies необходимо выполнить следующие операторы:
//Получение текста триггера SELECT SYS.SYSTRIGGERS.Trigdefn FROM SYS.SYSTRIGGERS WHERE Trigname ='Add_copies' //Указание имени владельца //AND Owner='Stepanov' //Указание наименивания таблицы //AND Tname='Books' ;OUTPUT TO d:\Log_db\trigtext.sql FORMAT ASCII
В утилите SQL Central применение второй альтернативы состоит в установке флажка Check on commit закладки Integrity окна свойств внешнего ключа Books_Copies в утилите SQL Central. Окно свойств внешнего ключа Books_Copies появляется после щелчка правой кнопкой мыши по его пиктограмме (). В утилите ISQL для достижения такого эффекта необходимо выполнить следующие SQL-операторы:
//Изменение свойств внешнего ключа //Сначала удалением внешнего ключа таблицы ALTER TABLE Stepanov.Copies DELETE FOREIGN KEY Books_Copies; //Создание заново внешнего ключа //с новыми свойствами ALTER TABLE Stepanov.Copies ADD "Books_Copies " NOT NULL FOREIGN KEY(Code_book) REFERENCES Stepanov.Books(Code_book) ON UPDATE CASCADE ON DELETE RESTRICT CHECK ON COMMIT /* признак проверки целостности только при выполнении оператора COMMIT */ // комментарий к внешнему ключу COMMENT ON FOREIGN KEY Stepanov.Copies.Books_Copies IS 'Внешний ключ для поддержания ограничений ссылочной целостности между таблицами Copies и Books'
Из двух вышеуказанных альтернатив по причинам, которые будут понятны далее, установим во внешнем ключе Books_Copies проверку ограничений целостности при завершении транзакции.
Теперь повторим попытку выполнения оператора INSERT для добавления новой записи в таблицу Stepanov.Books. Она должна завершиться успешно и в таблице Stepanov.Books появится одна новая запись. При этом в результате активизации триггера Add_copies таблица Stepanov.Copies пополнится десятком записей. Все они будут связанны с записью появившейся в таблице Stepanov.Books.
В рассматриваемом примере порядок очередности активизации триггера (предваряющий или завершающий) имеет важное значение. В других случаях совершенно безразлично в какой последовательности будут происходить обращение к триггеру. К этому следует добавить, что случае термины "предваряющий" и "завершающий" применятся только для строчных триггеров. Операторные триггеры, как следует из определения их названия, могут быть только завершающими.
При работе триггеров часто возникает необходимость обращаться как к исходным значениям полей таблицы, так и к их обновленным значениям. Для этой цели используются фраза REFERENCING с параметрами NEW AS или OLD AS. С ее помощью вводятся псевдонимы для обращения к исходным и обновленным данным. В триггере Add_copies фраза REFERENCING с параметром NEW AS определяет псевдоним New_books для обращения к значениям полей вновь введенной записи таблицы Stepanov.Books. В конечном же итоге смысл таких псевдонимов зависит от типа триггера и от событий, при возникновении которых активизируются триггеры. Назначение псевдонимов, вводимых фразой REFERENCING, приведено в табл. 24.
Возврат результатов хранимых процедур
Процедуры могут возвращать результаты вызывающим их программным объектам одним из следующих способов:
В качестве примера процедуры, возвращающей результат через параметры типа OUT, ниже приводится текст процедуры Get_number_absent. Данная процедура определяет количество книг, находящихся на руках у заданного читателя:
//Пример процедуры с параметрами типа OUT CREATE PROCEDURE Get_number_absent /* Процедура определяет количество книг, находящихся на руках у читателя, имеющего читательскую карточку с номером par_N_reader. Результат возвращается через выходной параметр count_books. */ ( IN Par_N_reader SMALLINT, OUT Count_books SMALLINT ) BEGIN SELECT COUNT(*) //Подсчет числа записей INTO Count_books //Результат записыва- //ется в Count_books FROM Stepanov.Absent //Указание //используемой таблицы WHERE //Условие выбора записей N_reader = Par_N_reader; END
Для того, чтобы проверить работу процедуры Get_number_absent необходимо выполнить следующую последовательность SQL-операторов:
//Проверка работы процедуры Get_number_absent /* Создание переменной Rez. Она существует только в течение текущего соединения с базой данных */ CREATE VARIABLE Rez SMALLINT; //Вызов процедуры CALL Get_number_absent (80, Rez); /* Вывод значения переменной Rez в окно Data утилиты ISQL */ SELECT Rez
В результате получим, у читателя с номером читательской карточки (N_reader) 80 на руках находятся четыре книги.
В процедуре Get_number_absent используется только один параметр тира OUT. В общем случае параметров такого типа в процедурах может быть несколько. По этой причине результат, формируемый процедурой Get_number_absent можно получить и с использованием оператора RETURN. Данный оператор возвращает в качестве результата одно значение. Для демонстрации этой возможности создадим процедуру Num_absent на базе приведенной выше процедуры Get_number_absent, путем незначительной модификации последней:
/* Процедура, возвращающая результат при помощи оператора RETURN */ CREATE PROCEDURE Num_absent /* Процедура определяет количество книг, находящихся на руках у читателя, имеющего читательскую карточку с номером Par_N_reader. Результат возвращается посредством оператора RETURN. */ ( IN Par_N_reader SMALLINT ) BEGIN DECLARE Count_books SMALLINT; SELECT COUNT(*) INTO Count_books FROM Stepanov.Absent WHERE N_reader = Par_N_reader; RETURN Count_books; END
Чтобы убедиться в работоспособности процедуры Num_absent следует воспользоваться такой последовательностью SQL-операторов:
//Проверка работоспособности процедуры Num_absent /* Если переменная уже есть, то создавать ее заново нельзя */ //CREATE VARIABLE Rez SMALLINT; /* Вызов процедуры и присваивание ее результатов переменной Rez */ SET Rez = Num_absent (80); /* Вывод значения переменной Rez в окно Data утилиты ISQL */ SELECT Rez
Эта процедура выдает те же данные, что и Get_number_absent.
В случае необходимости получения списка книг, выданных конкретному читателю, следует применить процедуру, формирующую результирующее множество. Процедура, решающая поставленную задачу приведена ниже:
//Процедура, формирующую результирующе множество CREATE PROCEDURE Get_list_absent /* Процедура определяет перечень книг, находящиеся на руках у читателя, имеющего читательскую карточку с номером par_N_reader */ ( IN Par_N_reader SMALLINT ) RESULT ( Fld_Author LONG VARCHAR, Fld_Title_book LONG VARCHAR, Fld_City_publish CHAR(15), Fld_Publisher CHAR(20), Fld_Year_publish SMALLINT) BEGIN /* В операторе SELECT введены псевдонимы B и A для таблиц Stepanov.Books и Stepanov.Absent, соответственно */ SELECT B.Author, B.Title_book, B.City_publish, B.Publisher, B.Year_publish FROM(Stepanov.Books AS B NATURAL JOIN Stepanov.Copies) NATURAL JOIN Stepanov.Absent AS A WHERE A.N_reader= Par_N_reader END
Результирующее множество формируется оператором SELECT. Этот оператор всегда формирует такое множество, если в нем не используется отсутствует служебное слово INTO. Данное служебное слово применяется для указания переменных, в которые будут записываться результаты выполнения оператора SELECT.
О том, что в качестве результата процедуры будет формироваться результирующее множество, указывает оператор RESULT. Отсутствие этого оператора не позволит в дальнейшем воспользоваться результирующим множеством даже если оно будет сформировано.
При описании параметров оператора RESULT их количество и типы должны соответствовать количеству и типам элементов списка выбора оператора SELECT. При этом имена этих параметров и элементов могут не совпадать друг с другом. Для проверки процедуры Get_list_absent выполните ее:
/* Проверка работоспособности процедуры Get_list_absent */ CALL Get_list_absent(80)
Теперь проверьте полученные результаты. Они будут представлены в окне Data утилиты ISQL. Содержимое результатов представлено в табл. 23.
Описание базы данных Biblia
База данных Biblia является основным элементом информационной системы "Библиотека". Эта база данных позволяет фиксировать факт поступления новых книг в библиотеку, ведение систематического каталога (систематизирующего книги по областям знаний), учет выдачи литературы читателям и ряд других библиотечных задач.
Для каждой выдаваемой книги устанавливается 15-дневный срок пользования. По истечении этого срока книга должна быть возвращена в библиотеку. Для особо популярных книг устанавливается боле короткий срок, в некоторых случаях он может превышать 15 дней.
Управление базой данных занимается администратор Степанов Ю.Л. и библиотекари Петрова Ю.П. , Иванова С.В., Сидорова О.К. и Попова И.Н. Все они зарегистрированы в базе данных под именами Stepanov, Petrova, Ivanova, Sidorova и Popova, соответственно. Библиотекари объединены в группу LIBRARIANS. Другая группа пользователей называется Readers. Она объединяет читателей библиотеки.
Взаимодействие пользователей с базой данных осуществляется при помощи хранимых процедур. Исключение составляют администратор -Степанов Ю.Л. и заведующая библиотекой Петрова Ю.П. Администратор имеет все привилегии, а заведующей библиотекой предоставлены более широкие полномочия по сравнению с библиотекарями.
База данных Biblia содержит шесть таблиц данных. Ее схема представлена на рис.А1.

Рис. А1. Схема базы данных Biblia
где Code_book - название поля, составляющего первичный ключ;
Code_book - название поля, составляющего внешний ключ.
Свойства таблиц базы данных Biblia представлены в табл. А1-А6. Все эти таблицы имеют одинаковую структуру. Назначение их колонок представлено ниже:
Таблица Sys_catalog хранит информацию об областях знаний (систематизированный каталог).
А1. Свойства таблицы Sys_catalog
| N_realm | * | Smallint | Auto-increment | * | нет | Код области знаний | |
| Title_realm | Char(45) | нет | Название области знаний |
Таблица Book содержит информацию о характеристиках книг.
А2. Свойства таблицы Book
| Code_book | * | Smallint | Autoin-crement | * | нет | Уникальный шифр (код) наименования книги | |
| Author | Long varchar | да | Фамилия и инициалы автора книги | ||||
| Coauthors | Long varchar | да | Фамилии и инициалы соавторов книги | ||||
| Title_book | Long varchar | нет | Название книги | ||||
| City_publish | Char(15) | нет | Город, где издана книга | ||||
| Publisher | Char(20) | нет | Название издательства | ||||
| Year_publish | Smallint | нет | Год издания книга | ||||
| Number | Smallint | нет | Кол-во экземпляров книги | ||||
| Start_date | Date | Тек. дата | нет | Дата поступления книги в библиотеку | |||
| Times_read | Smallint | 0 | нет | Кол-во заявок на данную книгу |
Таблица Book_Catalog классифицирует книги по областям знаний.
А3. Свойства таблицы Book_catalog
| N_realm | Smallint | нет | Код области знаний | ||||
| Code_book | Smallint | нет | Шифр (код) наименования книги |
Таблица Copies предназначена для фиксирования информации об экземплярах книг.
А4. Свойства таблицы Copies
| * | Smallint | Auto-increment | * | нет | Инвентарный N экземпляра книги | |
| Smallint | нет | Шифр (код) наименования книги | ||||
| Bit | 1 | нет | Признак наличия данного экземпляра книги |
Таблица Reader представляет собой каталог читательских карточек.
А5. Таблица Reader - Читательская карточка
:
| Name_reader | Char(18) | нет | Фамилия и инициалы читателя | ||||
| Adress | Char(26) | нет | Адрес читателя | ||||
| N_reader | * | Smallint | Auto-incre-ment | * | нет | N читательской карточки | |
| Hom_phone | Char(9) | да | N домашнего телефона | ||||
| Work_phone | Char(9) | да | N рабочего телефона | ||||
| Birthday | Date | (Тек.дата- Birthday)>17 | Дата рождения читателя |
Таблица Absent хранит данные о книгах, находящихся на руках у читателей.
А6. Свойства таблицы Absent
| N_books | * | Smallint | * | Нет | Инвентарный N экземпляра книги | ||
| N_reader | Smallint | Нет | N читательской карточки | ||||
| Beg_date | Date | Тек. дата | нет | Дата взятия книги | |||
| End_date | Date | Тек. Дата+15 | нет | Дата, когда должна быть возвращена книга |
Ограничение таблицы - CHECK(End_date>Beg_date)
|
Базы данных: Разработка - Управление - Excel
- Базы данных
- Разработка баз данных
- СУБД и базы данных
- Управление базами данных
- Классика баз данных
- Софт для создания базы данных
- SQL
- Access
- FoxProо
- Расширенная оптимизация подзапросов в Oracle
- Informix
- Линтер
- Postgres
- СУБД DB2
- InterBase
- Excel
- Таблицы Excel
- Справка Excel
- Программирование в Excel
- Деньги в Excel
- Задачи Excel