Конференция "Корпоративные базы данных'2001"

Новые возможности и перспективы развития Linter 6.0

Лилия Козленко, Relex

Введение

Разработка Linter SQL Server ведется с 1985 года. До 1990 года данное семейство совместимых СУБД для большинства используемых в то время в России вычислительных платформ было представлена под названием СУБД ИНТЕРЕАЛ. В 1990 году коллективом разработчиков СУБД было основано НПП РЕЛЭКС. С этого времени развитие СУБД определяет ориентация на соответствие международным стандартам в области обработки данных. Языком данных Linter становится SQL. В 1997 году СУБД Linter получила сертификат Гостехкомиссией России при Президенте РФ на соответствие 2-му классу по показателям защищенности от несанкционированного доступа к информации. Эта возможность реализована для Windows NT, Unix и NetWare.

На данный момент поставляемая коммерческая версия - Linter 5.9. В ближайшее время Релэкс выпускает коммерческую версию Linter 6.0.

Основные концепции сервера

Поставляются несколько вариантов дистрибутива - клиент, сервер, embedded. В состав каждого из вариантов входит SDK (Software Development Kit) - это совокупность инструментальных средств, разработанных для удовлетворения потребностей разработчиков приложений баз данных.

Linter работает на многих программно-аппаратных платформах:

FreeBSD, BSDi, OpenBSD, NetBSD, Linux (i386), UNIX SYSTEM V, UNIXWare, USIX, SINIX, VAX/VMS, OpenVMS, SUN Solaris (SUN SPARC, INTEL), Digital UNIX, AIX (RS/6000), SGI IRIX, MS WINDOWS 95/98, MS WINDOWS NT, MS WINDOWS 2000, NovellNetWare (3.1.x, 4.x, 5.x), OS/9000, OS-9, QNX, VxWorks, OS/2.

Ведутся работы по портации СУБД на платформу S/390.

Основные сетевые протоколы, поддерживаемые системой: TCP/IP, IPX/SPX.

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

Linter изначально создавалась как СУБД для русскоязычных пользователей. Сейчас поставляются русский и английский варианты дистрибутивов. В Linter определена кодировка по умолчанию для каждого вида клиента, если она специально не указана в окружении. Кроме того, каждое приложение, каждое соединение с СУБД (канал) может принимать и передавать данные в одной из 3-х кодировок - 866, 1251, koi8-r. Поддерживается также работа с unicode. Linter 6.x будет осуществлять поддержку и однобайтовых кодовых страниц и UNICODE.

В версиях Linter 6.x осуществлён переход к использованию различных процессоров при обработке запросов внутри ядра - выполняться на различных процессорах смогут не только различные запросы, но и различные части одного запроса, а также распараллеливаться низкоуровневые операции доступа к данным.

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

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

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

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

В Linter развита система архивирования базы данных. Для описания сценариев архивирования используется язык BSL (Backup Script Language). BSL является достаточно развитым средством по управлению реакцией на наступление некоторых событий как регулярных (например, - вечером каждой пятницы), так и специальных (например, превышение критического времени бездействия пользователей или превышение объёма сделанных в базе данных изменений). Возможно, также дублирование журнала транзакций на специальном отказоустойчивом устройстве и последующее восстановление базы данных с использованием этой информации.

В Linter реализованы иерархические транзакции - дерево транзакций. Каждая из транзакций иерархии представляет собой плоскую транзакцию с промежуточными точками синхронизации (flat transaction with savepoint). Операция фиксации или отката транзакции-предка каскадируется на всех его потомков, и выполняется снизу по иерархии. Вызовы хранимых процедур и триггеров также подчиняются правилам иерархии транзакций, каждая хранимая процедура или триггер выполняется как дочерняя транзакция.

В Linter реализованы элементы систем реального времени:

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

В Linter реализовано расширение для работы с внешними файлами данных, позволяющее использовать файлы для хранения информации вне собственно хранилища базы данных, а также расширение, предоставляющее полнотекстовой поиск - словные индексы для строк символов (char, varchar, nchar, nvarchar, BLOB), а также для внешних файлов (extfile).

СУБД при старте размещает определенные данные в пуле. Linter может работать при 200 страницах пула (страница составляет 4k). Это позволяет встраивать Linter в информационную систему пользователя.

В базе данных можно создать до 65534 таблиц, максимальное число столбцов в таблице -250, максимальное количество строк в таблице , длина строки до 4000 байт, размер составного ключа ограничен 256 байтами, несоставного ключа - 1024 байтами, составной ключ может состоять из 31 атрибута. В одной таблице может храниться следующий объем информации - 4032GB файлов данных, 4032GB файлов индексов, 4032GB файлов BLOB (приведен суммарный объем файлов каждого вида).

В Linter используются 2 типа индексов - B*-tree и битовые карты (bitmap). Linter использует битовые векторы для описания промежуточных результатов выполнения запроса. Оптимизатор sql умеет распознавать ситуации, когда выгодно повторное использование одного и того же битового вектора при обработке разных подзапросов одного запроса. Ведутся работы по использованию R-tree и M-tree для индексирования пространственных объектов и объектов с топологией, например карт, словарей и т.п. В Linter 6.x будут поддерживаться хэш-индексы. Изменяется оптимизация обработки битовых векторов для больших объемов (от 60 миллионов) записей.

Поддерживаемые интерфейсы

Клиент может использовать несколько интерфейсов для обмена данными с СУБД.

Native

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

inter

Интерфейсом самого низкого уровня является inter - внутренний интерфейс СУБД Linter является инструментальным средством разработки клиентских приложений базы данных Linter с использованием языков программирования третьего поколения (3GL). Все остальные интерфейсы работают посредством вызовов inter. Общая схема работы любого высокоуровневого интерфейса такова: функция интерфейса -> inter

Приложение-клиент и СУБД Linter могут обмениваться сообщениями размером до 64k. В Linter 6.x данные ограничения существенно ослабляются.

Всю информацию о соединении, типе передаваемого запроса, коде возврата СУБД, количестве записей в ответе хранит блок управления запросом (контрольный блок) CBL. При обработке select запроса Linter сразу передает количество записей в ответе, чего не делают большинство СУБД.

LinAPI

Интерфейс более высокого уровня, чем inter - это LinAPI. Библиотека представляет собой полный набор функций для работы с СУБД Linter из программ, написанных на языке C или Pascal. Она доступна в виде lapi325.dll для Windows 95,98, 2000, NT, объектной библиотеки на всех платформах, где есть клиент Linter. Асинхронность доступна в нескольких операционных системах: UNIX, Windows NT, VMS, OS-9, OS-9000.

LinPerl

Реализован интерфейс вызовов inter для Perl - одного из мощных языков обработки текстов. LinPerl позволяет осуществлять доступ ко всем ресурсам СУБД Linter.

DBI

Для доступа к ресурсам Linter из программ, написанных на Perl можно использовать также DBI. Поддерживаемая версия DBI - 1.02.

PHP

Для СУБД Linter разработан модуль, позволяющий осуществлять доступ ко всем ресурсам СУБД Linter из программ, написанных на PHP. На данный момент используются версии 3 и 4.

Embedded SQL

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

ODBC

ODBC драйвер Linter поддерживает стандарт ODBC 3.5. Реализована работа с unicode.

JDBC

Linter JDBC (спецификация JDBC 1.2) позволяет писать приложения на Java, используя СУБД Linter.

Реализованы следующие типы драйверов

LinTCL

Имеется также средство - LinTcl, которое расширяет возможности Tcl/Tk (Tcl - Tool Command Language, Tk -Tool Kit) для работы с СУБД Linter, что позволяет использовать Tcl/Tk для быстрого написания информационных приложений в операционных средах, в которых работает Tcl/Tk (Unix, Windows NT/95).

Библиотеки совместимости

Имеются средства конвертации данных из DBF-формата, программные интерфейсы для работы с Linter из Clipper, FoxPro для совместимости со старыми приложениями и конвертации данных из них.

Отметим так же совместимость Linter с СУБД Oracle на уровне Pro*C и OCI. Благодаря библиотеке OraLin, приложение, работающее с СУБД Oracle, будет с таким же успехом работать (после перекомпоновки, а в Windows, в случае использования динамически подгружаемых библиотек, и без неё) и с Linter. Кроме того, для более полной совместимости с СУБД Oracle был расширен синтаксис языка запросов, который в данный момент поддерживает многое из того, что и Oracle SQL, вплоть до иерархических запросов.

Особенности реализации

Схема данных

В Linter реализована операция создания таблицы согласно SQL92 (Intermediate SQL Level). Допускаются длинные имена идентификаторов до 66 символов.

Получение уникального идентификатора записи

Для получения уникального идентификатора записи в Linter используется ключевое слово AUTOINC в спецификации атрибута таблицы.

AUTOINC INITIAL <значение>
AUTOINC RANGE (начало_диапазона : конец_диапазона [,...])

Автоинкрементным может быть столбец с типом данных SMALLINT или INTEGER (INT). Совместимыми ограничениями целостности являются только AUTOINC и PRIMARY KEY.

В версиях Linter 6.x также будут реализованы последовательности.

Декларативная ссылочная целостность

Действия ссылочной целостности определены для операций delete и update. Описание декларации можно указать в спецификации атрибута, или в декларации внешнего ключа. Реализация декларативной ссылочной целостности полностью соответствует SQL92. Для внешнего ключа автоматически создается индекс.

Допускается отсутствие списка атрибутов в декларации references, в этом случае внешний ключ соответствует первичному ключу таблицы, указанной в спецификации references.

Check

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

Особенности реализации SQL

Select

Она возвращает значение выражения, если оно вычислилось без ошибок, если же при вычислении выражения были получены некоторые определенные ошибки, то возвращается NULL, а ошибка игнорируется.

Иерархические запросы

В Linter реализованы иерархические запросы. По синтаксису эти запросы совместимы с Oracle. Наличие петель в графе детектируется и выдается соответствующий код завершения. Linter использует собственное расширение языка для обработки иерархий connect by prior.

Для иерархических запросов поддерживается выполнение delete where current of cursor, update where current of cursor.

Join

Реализация full outer join, left outer join, right outer join, inner join в Linter полностью соответствует SQL92. Синтаксис совместим с IBM DB2 UDB. Синтаксис Oracle для описания таких join не поддерживается.

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

Intersect, Except

В Linter 6.x реализованы предложения intersect, except.

Event

Для работы с механизмом событий пользователь может использовать непосредственно дополнительные конструкции языка SQL.

Существует одна очередь событий, общая для всех пользователей. При возникновении определенной ситуации событие считается наступившим и заносится в очередь. Это происходит:

Приоритеты соединений, запросов, пользователей

В Linter реализован механизм управления приоритетами заданий обработки данных.

Каждое соединение имеет атрибут приоритета выполнения запросов. Более высокий приоритет означает более высокую скорость обработки запросов и большее количество ресурсов при его обработке. Новое соединение помещается в очередь в зависимости от своего приоритета (в конец одноприоритетной группы). Чем выше приоритет, тем ближе к началу очереди расположено соединение. Приоритет системных каналов равен 253, является неизменным и самым высоким. При открытии соединения значение приоритета устанавливается в 0, если не указан приоритет. В дальнейшем его значение может меняться.

Search engine

Linter Search engine предназначен для выполнения задач полнотекстового поиска. Индексируются следующие типы данных:

char, varchar, nchar, nvarchar, BLOB, внешний файл данных.

Функции Search Engine и подсистемы индексирования

Для обработки разнородных документов используется технология фильтров. Фильтры предназначены для разбора конкретных форматов данных, представленных в БД или файле. Базовым набором фильтров является:

HTML    XML     Word    Excel   PDF     TXT     RTF

Все фильтры имеют единый API для взаимодействия с индексирующей подсистемой. Предоставлена возможность подключения пользовательских фильтров.

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

Ядро Linter инициирует процесс индексации либо по событиям, связанным с обновлением данных (для полей типа BLOB), либо по расписанию (для внешних файлов), либо принудительно по команде SQL.

Защита данных

Linter предоставляет как дискреционную, так и мандатную защиту. Мандатная защита реализована на уровне ядра СУБД.

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

Дискреционная защита

В СУБД Linter реализована с помощью аппарата привилегий, которые можно подразделить на две категории:

привилегии безопасности (позволяют выполнять административные действия)

и привилегии доступа (определяют права доступа конкретных субъектов к определенным объектам)

Эти привилегии может передать или отобрать только владелец соответствующих объектов - таблиц, представлений и синонимов. В Linter 6.x разрешается передача привилегий with grant option. Привилегии можно объединять в роли.

Мандатная защита

Предназначена для построения информационных систем с высокой степенью защищённости и состоит в назначении различных уровней ценности для всей хранимой информации.

Для этого в СУБД Linter используются метки доступа. Метка доступа состоит из трех частей: группы доступа (именованная совокупность пользователей) и двух уровней доступа. Для субъектов базы данных они называются: уровень доверия пользователя (WAL) и уровень доступа пользователя (RAL). Для объектов базы данных они называются: уровень чтения данных (RAL) и уровень доступа данных (WAL). Метки доступа могут быть назначены всем субъектам и объектам БД: начиная от устройств размещения объектов данных devices, таблиц и до полей записей включительно.

Реализованная модель защиты препятствует следующим видам нарушений:

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

В Linter 6.x вводится поддержка защиты для хранимых процедур. Также вводится поддержка защиты для внешних файлов данных EXTFILE. Специальные версии Linter обеспечивают шифрацию базы данных.

Хранимые процедуры и триггеры

Процедурный язык СУБД Linter предназначен для описания хранимых процедур и триггеров базы данных. Язык разработан в соответствии с рекомендациями стандарта SQL92/PSM (Persistent Stored Modules).

Хранимые процедуры и триггеры обрабатываются транслятором хранимых процедур. С точки зрения Linter триггер является специальной хранимой процедурой, для которой строго регламентирован ее вызов (триггерное действие), передаваемые ей и возвращаемые ею параметры.

В хранимых процедурах можно использовать ddl, dml операции. Хранимая процедура может возвращать курсор. В хранимых процедурах можно динамически формировать запросы sql, так как имеется достаточный набор функций, обеспечивающих работу со строками. Реализованы функции работы со строками, с датами, с курсорами, а также функция обработки ошибок errcode().

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

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

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

В СУБД Linter реализованы возможности отладки хранимых процедур и триггеров. Для этого процедура или триггер должна содержать опцию for debug.

Отладчиком предоставляются следующие возможности:

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

LAB

Инструментальная система быстрой разработки приложений Linter Application Builder (LAB) функционирует в среде OC Windows95/98, Windows NT/2000, UNIX (Linux, Free BSD, Sun Solaris). Для расширения сферы применения LAB, работы ее с другими СУБД осенью 2001г. ожидается выход версии 1.2, в которую будет входить поддержка JDBC.

Для построения приложений LAB использует объектно-ориентированный компонентный подход. Прикладные системы строятся как иерархия имеющихся в распоряжении разработчика компонент, набор которых может постоянно расширяться, включая как разработанные в самой системе, так и внешние динамически подключаемые модули.

Стандартный набор компонент включает различные визуальные объекты (контейнеры и элементы управления/ввода), компоненты для работы с источниками данных (в частном случае - с СУБД ЛИНТЕР), графические примитивы, компоненты для генерации отчетов (вывод на принтер или в формате HTML, в ближайших версиях - экспорт в RTF и PDF), другие функциональные компоненты (меню, таймер и т.д.).

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

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

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

На данный момент LAB использует оригинальный язык АТОЛЛ, сочетающий возможности современных объектно-ориентированных языков, переносимость скомпилированного байт-кода и низкие требования к вычислительным ресурсам. В будущих версиях системы предполагается дополнительная возможность использования по выбору языков Java и C++.

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

Преимущества системы LAB:

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

Дальнейшее развитие LAB

Ближайшие версии системы будут включать:

Разработчикам

Дилерам и разработчикам, которые предполагают поставлять свои программные продукты, использующие Linter, предоставляется скидка от 50 процентов.

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