Firebird. Руководство разработчика баз данных [заметки]
1
Квадратные скобки могут присутствовать в операторах DDL для задания размерности массивов. -Прим. перев.
2
Не думайте, что копирование файла базы данных на компакт-диск сделает базу данных базой только для чтения. База данных должна быть сделана только для чтения с использованием утилит gbak или gfix до записи на компакт-диск. См. соответствующие главы по инструментам в части IX.
3
Под 64-битовым вводом/выводом имеется в виду поддержка в сервере, операционной системе и файловой системе работы с файлами размером больше 4 Гбайт, что требует не старой 32-битовой адресации, а 64-битовой. Это не имеет отношения к поддержке 64-разрядных процессоров. - Прим. науч. ред.
4
Заметьте, однако, что пользовательские библиотеки внешних функций не являются переносимыми между платформами. Необходимо создавать версии этих библиотек для каждой платформы, на которой может располагаться база данных. Все платформы, поддерживающие Windows, могут использовать те же библиотеки Windows; библиотеки разделяемых объектов для платформ POSIX не обязательно будут выполняться на всех платформах POSIX.
5
Из-за ошибки в Windows использование DummyPacketlnterval может привести к зависанию или краху Windows на клиентской стороне. Объяснения см. в следующей статье Microsoft Support: http://support,microsoft.com/default.aspx?kbid=296265. Не рекомендуется его использовать и в системах, отличных от Windows. Он может даже мешать возможному отключе-
6
По умолчанию [x]inetd в своем файле конфигурации имеет ограничение на число стартуемых экземпляров конктретного сервиса. Это может проявляться как ошибка при подключении очередного пользователя (напрмер, невозможно подключить более 60 пользователей). Отредактируйте файл конфигурации [x]inetd и установите желаемый лимит количества сервисов fb_inet_server, т.е. количества подключний к Классическому серверу FireBird. Прим. науч. ред.
7
Строго говоря, наличие уникального ключа в таблице не является обязательным для реляционных баз данных, хотя его наличие весьма желательно. - Прим. перев.
8
Трудно определить, какой возможен максимальный размер баз данных Firebird. Пользователи сообщают о базах данных в 900 Гбайт, которые еще "продолжают расти".
9
О двухфазном подтверждении транзакций см. в главе 25.
10
Рекомендуется свободно распространяемый драйвер IBProvider Дмитрия Коваленко. Подробности см. на http://www.ibprovider.com/rus/index.html.
11
Список ссылок на документальные источники см. в приложении 12.
12
На этих платформах, не имеющих поддержки сервисов, размещение может быть иным. Необходимо проверять, установлены ли предыдущие клиенты Firebird или InterBase.
13
Встроенный сервер для Linux не соответствует ему же в Windows. Как и в модели под Windows, клиент libfbembed.so Имеет "прямое соединение" с экземпляром сервера. В Linux та же библиотека может создавать экземпляр встpoeннoro сервера на сетевом сервере. Однако libfbembed.so cтpoгo рекомендуется в качестве клиента, если приложение содержит потоки.
14
Официальный инсталлятор и instclient.exe трактуют с:\ Windows\systeт как "системный каталог" для этих платформ. Некоторые "неофициальные" инсталляторы следуют соглашениям, установленным фирмой Borland для InterBase, как и некоторые инсталляторы Firebird 1.0, трактующие C:\Windows как системный каталог, Оба размещения должны быть проверены, если вам нужно отыскать инсталлированноrо клиента.
15
Точность задает количество значащих цифр (игнорируя конечные или начальные нули), которое может храниться в типе данных без переполнения или потери данных.
16
Хранимыми типами являются SMALLINT, INTEGER или BIGINT в зависимости от объявлен-
17
Использование "!=" в качестве замены для "<>" допустимо в Firebird, но не соответствует стандарту. Те, у кого хорошее экстрасенсорное восприятие, будут придерживаться "о", чтобы сделать код более удобным для чтения.
18
Часто таблица RDB$DATABASE используется для "пустых" запросов, которые возвращают одно вычисляемое значение или контекстную переменную. Это реальная системная таблица, содержащая одну и только одну строку. Она используется как DUAL В Oracle.
19
Несмотря на то, что в третьем диалекте генераторы являются числами BIGINT, совершенно необязательно столбец первичного ключа, для которого будет применяться генератор, также делать BIGINT. При выборе типа данных для столбца первичного ключа следует учитывать конкретные нужды предметной области. Как правило, в большинстве случаев вполне достаточно INTEGER. - Прим. науч. ред.
20
Существуют техники для поддержки непрерывных последовательностей с использованием генераторов, которые могут быть реализованы в случае абсолютной необходимости повторного применения неиспользуемых промежутков в сериях, не являющихся значениями ключа. Список Tech Info "Контролируемые серии чисел" (An Auditable Series of Numbers) описывает подобную технику на http://www.ibobjects.com/TechInfo.html.
21
Хранится в системной таблице RDB$FIELDS как RDB$FIELD_PRECISION.
22
Хранится в системной таблице RDB$FIELDS как RDB$FIELD_SCALE.
23
Спасибо Джеффу Ворбойзу (Geoff Worboys) за его понятные замечания по этой больной теме.
24
Так в оригинале. В документации по InterBase указан диапазон дат от 1 января 100 г. до 29 февраля 32 768 г. - Прим. перев.
25
Для того чтобы осуществлять агрегацию интервала (суммирование, среднее), необходимо хранить не время окончания интервала, а его длительность, например в секундах, в обычном целочисленном типе данных. - Прим. науч. ред.
26
Вероятно, не будет ошибкой, если эта дата дает целое значение, называемое Измененным юлианским номером дня. Подробности см. на http://hermetic.nofadz.com/cal_stud/jdn.htm.
27
API предоставляет программистам две полезные функции для преобразования структуры дата/время клиентского языка в формат Firebird и из формата Firebird. См. в документе фирмы Borland "API Guide" (Руководство по API) описание функций isc_encode_date() и isc_decode_date().
28
Тип BLOB не является волшебной палочкой для сохранения и поиска больших объемов файлов двоичных данных. Иногда при учете производительности накладные расходы и неуправляемость хранения нединамических объектов данных, вроде фильмов или звуков, в базе данных перевешивает преимущества, которые вы предполагали. Хранение ссылок на объекты файловой системы может быть хорошим решением.
29
Возможна передача строковых типов как входных данных для BLOB С предоставлением серверу возможности их конвертирования. При этих условиях невозможно хранение BLOB, который превышает ограничение для строк в 32 Кбайта.
30
Чтобы понять эти тонкости, обратитесь к разд. "Темы оптимизации" главы 18.
31
При изменении типов домена учитывайте, что в хранимых данных могут быть данные, которые не пройдут преобразование из одного типа в другой. Например, VARCHAR В INTEGER сконвертируется, только если VARCHAR будет содержать цифры и числа, допустимые для INTEGER - Прим. науч. ред.
32
Существует море литературы, содержащей описания техник эффективного анализа задач бизнеса для проектировщика реляционных баз данных, размышления об уровне нашей профессиональности. Автор особенно рекомендует Data Modeling Essentials: Analysis, Design and Innovation, 2nd Edition by Graeme C. Simsion (Coriolis, 2000).
33
Команда SET TERM не является SQL-оператором, понимаемым Firebird. Это команда утилиты 1SQL, позволяющая задать индикатор окончания оператора DDL. SET TERM используется только там, где инструмент разработчика может выполнить несколько команд DDL и DML в одном скрипте. - Прим. науч. ред.
34
Замечание для программистов API. В динамическом SQL (DSQL) оператор CREATE DATABASE или CREATE SCHEMA должен быть выполнен с EXECUTE IMMEDIATE. Дескриптор базы данных и имя транзакции, если присутствуют, должны быть инициализированы нулем до использования.
35
Для "русскоязычных программ" следует использовать набор символов WIN1251.- Прим. перев.
36
При создании или расширении многофайловой базы данных для всех файлов базы данных используйте либо только LENGTH (явную длину конкретного файла), либо только STARTING AT (указание начала нового файла), для избежания путаницы. - Прим. науч. ред.
37
Сервис API предоставляет доступ к обоим методам для перевода базы данных в режим только для чтения. Чтобы получить информацию, изучите доступную документацию по различным группам параметров действий сервиса (isc_action_svc_xxx), которые могут передаваться в функцию isc_service_start О . Множество компонентов доступа к базе данных реализуют эти функции для использования в различных языковых средах.
38
К сожалению, теневое копирование не обеспечивает восстановление, если база данных была случайно удалена оператором DROP DATABASE. Когда вы удаляете таким образом базу данных, ее теневая копия (shadow) также удаляется.
39
Для автора оказалось невозможным найти кого-нибудь, кто мог бы объяснить преимущества (если они существуют) ведения множества наборов теневых копий. Система нумерации могла быть результатом некоторой функциональности, которая никогда не была реализована. При отсутствии лучшей информации, похоже, имеет смысл остановиться на одном наборе
40
CONDITIONAL SHADOW на самом деле имеет смысл как дополнение к AUTO, и только. Если CONDITIONAL создана как второй набор по отношению к AUTO, то она будет пустой до тех пор, пока с базой или с AUTO SHADOW не произойдет сбой. При сбое CONDITIONAL SHADOW будет наполнена страницами из целого файла и примет на себя функции альтернативной копии, таким образом даже в случае сбоя дисковой системы будет существовать две копии базы данных. И, разумеется, CONDITIONAL SHADOW не имеет смысла как дополнение к manual shadow (как и комбинация из двух SHADOW- AUTO + MANUAL), Т. к. при MANUAL в случае сбоя работа сервера с базой останавливается. - Прим. науч. ред.
41
Если вы кодируете CREATE TABLE в приложении встроенного SQL (Embedded SQL) с намерением также в этом приложении заполнять данными эту таблицу, то таблица вначале должна быть объявлена в предшествующем операторе DECLARE TABLE.
42
Если ваша операционная система поддерживает использование многобайтовых символов в именах пользователей или вы используете многобайтовый набор символов при определении ролей, то каждый столбец, в котором будут сохраняться в качестве значений по умолчанию CURRENT_USER или CURRENT_ROLE, должен быть определен с использованием совместимого набора символов.
43
См. ограничение NOT NULL для столбца, NULL может оказаться несовместимым значением
44
Здесь мы говорим об архитектуре Intel. Выравнивание может отличаться в некоторых архитектурах.
45
Создание спецификаций для чтения/записи во внешний файл может потребовать гораздо больше детальных знаний о формате, чем здесь обсуждается. Наборы символов и размеры в байтах могут оказаться проблемой. Во многих случаях использование в качестве набора символов нейтрального набора символов OCTETS в определении внешней таблицы может решить некоторые проблемы. Импорт и экспорт данных не подчиняется принципу "один размер подходит всем".
46
Внешний файл должен быть освобожден, когда завершатся выполняющиеся с ним операции. Для сервера некорректно оставлять его заблокированным, поскольку внешние данные не менялись. Это программная ошибка, по поводу которой читатель может запросить исправле-
47
При этом существует одно исключение. Индекс внешнего ключа с очень низкой селективностью - высочайший уровень дублирования небольшого количества значений в таблице - может оказать серьезное влияние на производительность, если его ключевые столбцы формируют условие соединения.
48
Толковое добавление к этому в книге Data Modeling Essentials, 2nd Edition by Graeme Simsion (Coriolis, 2000).
49
Действие NO ACTION иногда называют "ограниченным" действием.
50
Не следует полагаться на триггерную ссылочную целостность потому, что ограничения PRIMARY KEY, FOREIGN KEY и UNIQUE работают вне контекста транзакций (т. е. "видят" все версии записей), а пользовательские триггеры - в контексте пользовательских транзакций. В результате пользовательский триггер, проверяющий наличие определенной записи, никоим образом не узнает, что эта запись на самом деле уже удалена или изменена в другой, конкурирующей, транзакции. -Прим. науч. ред.
51
И надеяться, что эта маленькая причуда оптимизатора с ключами один-к-одному будет разрешена в следующих релизах.
52
В случаях, когда условие поиска задает LIKE ' string% ', оптимизатор обычно преобразовывает его к предикату STARTING WITH 1 string1 и использует индекс, если он доступен.
53
Составные индексы не являются столь важными в Firebird, как в большинстве других СУБД. Часто их использование является неоправданным, потому что Firebird интеллектуально использует индексы из одного столбца.
54
В Firebird и InterBase индексы не могут быть "разбалансированы". -Прим. науч. ред.
55
На самом деле индексы в Firebird и Interbase никогда не бывают "разбалансированными", т. е. глубина индекса всегда постоянна для всех листовых страниц. Соответственно, перестраивать индекс имеет смысл, когда он поврежден и когда требуется высокая скорость массовых вставок, удалений или обновлений. В реальных и больших базах данных плотность заполнения страниц индекса не опускается ниже 85%, независимо от числа дубликатов ключей. - Прим. науч. ред.
56
Изложенное понятие селективности обратно числам, реально используемым оптимизатором. Оптимизатор берет информацию о селективности из столбца RDB$STMTSTICS таблицы RDB$INDICES, который вычисляется по формуле 1/(число ключей - число повторяющихся ключей). Чем меньше это число, тем выше селективность индекса и тем полезнее он с точки зрения оптимизатора. Для уникальных индексов селективность стремится к нулю (зависит от числа ключей). Для неуникальных индексов худшим случаем является селективность, равная 1, когда все значения ключей идентичны. - Прим. науч. ред.
57
На оптимизатор в основном влияет то, что с течением времени если индекс меняется (меняются индексируемые данные), то статистика индекса остается неизменной, т. к. она меняется только вручную вызовом оператора SET STATISTICS. Поэтому вместо рекомендуемого здесь периодического пересоздания индексов лучше озаботиться регулярным пересчетом статистики индексов. - Прим. науч. ред.
58
В этом месте разговор идет со слов Ann Harrison, "матери InterBase".
59
Сборка мусора в больших цепочках дубликатов ключей значительно ускорена в Firebird 2.0. Собственно, в Firebird 2.0 изменена структура индексов. - Прим. науч. ред.
60
IBOConsole поддерживает Lorenzo Mengoni - см. http://www.mengoni.it.
61
Это неверно, и автор подтвердил ошибку. Next transaction не имеет никакой связи со sweep. Автоматический sweep стартует, когда разница между Oldest Snapshot и Oldest Interesting больше Sweep interval (в Firebird 2.0 за верхнюю границу берется не Oldest Snapshot, a Oldest Active). -Прим. науч. ред.
62
Американцы предпочитают говорить "сиквел". -Прим. перев.
63
Рекомендую обратиться на http://www.interbase-world.com. Там можно найти перевод на русский язык некоторых книг из документации фирмы Borland по InterBase 7.1. - Прим. пе-
64
В переводе на русский язык книга называется М. Грабер "SQL" и доступна в книжных магазинах начиная с 2001 г. - Прим. науч. ред.
65
Фактически синтаксис именованного курсора доступен как "скрытая возможность" и в PSQL, хотя он не полностью реализован в Firebird 1.5. Синтаксис был расширен после версии 1.5 и должен появиться в последующих релизах.
66
Более подробную информацию см. в Embedded SQL Guide (EmbedSQL.pdf) в документации по InterBase 6.0, опубликованной Borland.
67
Программисты прямого API и разработчики компонентов интерфейса могут получить больше информации из InterBase API Guide (APIGuide.pdf) в документации по InterBase 6.0, опубликованной Borland.
68
Поскольку выходной набор DISTINCT предполагает существование дубликатов, чтобы обеспечить уникальность потока поиска для индивидуального изменения, нельзя полагаться на его поля. Некоторые средства разработки явно трактуют выходные наборы, полученные от запросов DISTINCT как неизменяемые.
69
В InterBase 6.5 и выше вместо FIRST используется ключевое слово ROWS, следующее за ORDER BY. Этот же синтаксис может быть использован и в Firebird 2.0. Подробнее о синтаксисе ROWS см. В документации по InterBase 7.x - Прим. науч. ред.
70
FIRST и SKIP всего лишь ограничивают количество записей, выдаваемых клиенту. Запрос вне зависимости от наличия или отсутствия FIRST и SKIP всегда будет выполнен целиком. - Прим. науч. ред.
71
Если два набора, объединяемых UNION, принципиально не будут содержать дубликатов строк, необходимо использовать UNION ALL, чтобы сервер не занимался зря работой по удалению несуществующих дубликатов строк. - Прим. науч. ред.
72
Это "ускоренное" вычисление логических значений, которое реализовано в Firebird 1.5 и выше. Firebird l.Ojc использует полное логическое вычисление. Для тех, кто любит изобретательные загадочные выражения, старый метод может быть восстановлен при использовании параметра конфигурации FullBooleanEvaluation.
73
Операторы сравнения Firebird поддерживают сравнение значения левой части с результатом скалярного подзапроса (встроенного запроса) в правой части оператора. Подробности см. в разд. "Запросы существования" позже в этой главе и в обсуждении подзапросов в следующей главе.
74
Для русского языка обычно используется кодировка WIN 1251, и два варианта COLLATE - WIN 1251 (по умолчанию), и PXWCYRL. За особенностями использования вариантов COLLATE, и кодировками и сортировками для других языков (в том числе стран СНГ) обратитесь к ReleaseNotes. - Прим. науч. ред.
75
Firebird 1.0.x выполняет полные логические вычисления. Сокращенное вычисление булевых выражений в более поздних версиях может быть отключено на уровне сервера при установке параметра конфигурации CompieteBooleanEvaluation. Подробности см. в главе 3.
76
До Firebird 1.5 функция UPPER работала только для столбцов COLLATE PXW_CYRL (или при явном указании для конкретного столбца). В Firebird 1.5 таблица перекодировки символов в верхний регистр есть и в "умолчательном" COLLATE WIN1251. - Прим. науч. ред.
77
Программная логика в комбинации с техниками DSQL, описываемые в данной главе, могут быть использованы в модулях PSQL, которые возвращают клиентам виртуальные таблицы, а также в других модулях PSQL. См. часть VII. Просмотры, рассматриваемые в главе 24, обеспечивают другие способы получения наборов данных из нескольких таблиц.
78
Ключевое слово OUTER для всех случаев является необязательным. -
79
В "SQL for Smarties" Joe Celco предлагает интересные решения для хранения и поддержки древовидных структур в реляционных базах данных (Morgan Kaufmann, 1999).
80
Многие аспекты плана, сконструированного внутренне оптимизатором, не видны в плане, показанном в isql и недоступны через синтаксис предложения PLAN для пользовательских планов. Синтаксис показывает только подмножество реального плана, которому будет следовать сервер при выполнении запроса.
81
Поскольку база данных примера не имеет таблиц без индексов, некоторые примеры в этом разделе используют специально описанные неиндексированные версии таблиц EMPLOYEE, PROJECT и DEPARTMENT, названные EMPLOYEE1, PROJECT1 и Departments соответственно. Скрипт с именем NO_INDEXES.SQL для создания этих таблиц может быт загружен с http://www.apress.com.
82
Другой причиной использования алиасов при задании запросов и планов является то, что, скорее всего, подобная согласованность будет поддерживаться в следующих версиях Firebird.
83
"Сортировка по индексу" является недоразумением. Предложение ORDER В плане запроса дает указания серверу читать поток вне порядка хранения (то есть с использованием навигационного индекса для поиска строк). Этот метод может работать только с управлением потоком в цикле и создавать предварительно упорядоченный результат. Поскольку ORDER может быть использован только для левого потока в соединении, любое правило, которое влияет на упорядоченность соединения - например, внешнее соединение, которое не дает возможность потоку быть самым левым - будет иметь преимущество.
84
Оптимизатор InterBase, Firebird 1.0 и 1.5 считает составные индексы более селективными, чем они есть на самом деле. В этом виновата особенность подсчета селективности, которая производится целиком для всего ключа. В Firebird 2.0 селективность составных индексов учитывается отдельно по каждому сегменту составного ключа, что позволяет избежать сильных проколов в оптимизации запросов. - Прим. науч. ред.
85
Подобное дополнительное условие может привести к тому, что вообще никакие индексы не будут использоваться. Более правильным в случае множества условий поиска является "отключение" низкоселективного индекса для отдельного столбца путем превращения условия сравнения в вычисляемое: для числовых столбцов - where field+0 = value, для строковых - where field || '' = value. - Прим. науч. ред.
86
В этом случае также желателен и триггер BEFORE UPDATE. - Прим. перев.
87
Theo Haerder and Andreas Reuter, "Principles of Transaction-Oriented Database Recovery", ACM Computing Surveys 15(4) (1983): 287-317.
88
Andreas Reuter and Jim Gray, Transaction Processing Concepts and Techniques (San Francisco, С A: Morgan Kaufmann, 1993).
89
Программисты API. смотрите в TP В константу isc_tpb_no_auto_undo.
90
Спасибо, Ann Harrison!
91
В оригинале не совсем верно выбраны термины. Никакой "таблицы", конечно, нет. Есть битовый массив, который меняется при изменении состояния транзакций и который копируется в память (частично) при старте транзакций SNAPSHOT. Также TIP не может быть "раздут", поскольку битовый массив просто растет в размерах при старте каждой новой транзакции и строится заново при очередном восстановлении (restore). Размер TIP равен Next Transaction / 4 (в байтах). - Прим. науч. ред.
92
Здесь и далее в тексте практически не упоминается важный параметр Oldest Snapshot Transaction (OS Г). - Прим, науч. ред.
93
Хорошо понимать цикл жизни транзакций в Firebird, если вы работаете и с другими реляционными СУБД, например, с PostgreSQL, которая имитирует многоверсионную архитектуру Firebird.
94
Во всех версиях Firebird и в InterBase до версии 7.1 sweep срабатывает, когда расстояние между OIT и Oldest Snapshot Transaction (а не OAT) становится больше sweep interval (см. разд. "Другие переключатели gstat" главы 18). В Firebird 2.0 срабатывание sweep будет зависеть именно от разницы OAT-OIT. - Прим. науч. ред.
95
OST - это на самом деле номер транзакции, которая была активной на момент старта OAT. - Прим. науч. ред.
96
Возможно, здесь имеются в виду внешние ключи с опцией ON UPDATE/DELETE CASCADE. В этом случае при изменении мастер-записи автоматически модифицируются записи-детали. Ни в каких других случаях "зависимые" таблицы не обновляются сервером. - Прим. науч. ред.
97
Ничто не запрещает завершить транзакцию по COMMIT, независимо от успеха или неуспеха выполнения в ней операторов. Разумеется, именно в обработчиках исключений вызывать COMMIT действительно не рекомендуется. - Прим. науч. ред.
98
Для энтузиастов Borland опубликовал документ "Embedded SQL Guide" (Руководство по встраиваемому SQL) как часть комплекта документации по InterBase. Версии этого тома также доступны в формате PDF на некоторых сайтах - найдите через Google "EmbedSQL.pdf".
99
То же, "API Guide" (Руководство по API). APlGuide.pdf.
100
SET TRANSACTION, как COMMIT и ROLLBACK, не является оператором, выполняемым на сервере. Будучи оператором Embedded SQL он преобразуется утилитой gpre (или isql) в вызовы Firebird API (isc_start_transaction...). - Прим. науч. ред.
101
Для большинства этих реализаций была выполнена трансляция заголовочного файла С Firebird в соответствующий язык высокого уровня для предоставления средств API Firebird (или InterBase) для этого языка. Если вы планируете разрабатывать программы с использованием API, хорошим решением будет поиск в Интернете существующих трансляций заголовочного файла.
102
Фактически существуют две различные функции для запуска транзакции: isc_start_ transaction() используется в языках, которые поддерживают передачу переменного количества аргументов при вызове функций; isc_start_multiple() используется в языках, требующих статический список аргументов. isc_start_transaction() ограничивается одной транзакцией, которая может использовать до 16 баз данных, в то время как isc_start_multiple О запускает транзакции, обращающиеся к большему количеству баз данных или обращающиеся к переменному количеству баз данных, которое может превышать 16.
103
Тип isc_tr_handle является указателем void, определенным в заголовочном файле ibase.h, который расположен в каталоге /include в каталоге вашей инсталляции Firebird.
104
Если в будущем структура TPB изменится, эта константа также будет изменена, так что сервер легко сможет обрабатывать клиентов, скомпилированных в друrой версии.
105
Неанглийские версии файла сообщений не были доступны во время написания данной книги. Готовятся проекты трансляции. Если вас интересует локализованный файл сообщений, обратитесь к спискам сообщества Firebird. Сообщите, что вы заинтересованы в участии в проектах локализации!
106
Существует несколько неприятных исключений из этого правила. Например, ISC ERROR CODE: 335544321 "Arithmetic exception, numeric overflow, or string truncation" (Арифметическое исключение, числовое переполнение или усечение строки) объединяет такой широкий диапазон возможностей, что оно обычно вызывает состояние изумления даже у программиста, который допустил возможность появления такого исключения.
107
Если клиентская библиотека удаленного клиента находит локальную копию файла сообщений в известном "корневом" каталоге, Firebird 1.5 будет использовать именно ее и перекроет этот файл в каталоге сервера RootDirectory. Поскольку до сих пор не решено, является ли это желательной возможностью, то может быть разумным устранить зависимость от такого поведения в интересах будущей защиты. В любом случае файловые системы рабочих станций являются весьма уязвимыми при неправильном поведении пользователя.
108
По причине ограничения объема книги тема именованных курсоров затрагивается лишь слегка. Для работы с ними API предоставляет группу функций isc_dsql_*. Синтаксис оператора DECLARE CURSOR, полностью реализованный в ESQL, доступен в некоторых средах программирования DSQL. Описание использования именованных курсоров в модулях PSQL см. в главах 29 и 30.
109
Инструмент IBAnalyst (см. www.ibase.ru) выдаст все возможные предупреждения и рекомендации по поводу состояния транзакций на сервере. - Прим. науч. ред.
110
Выполнение backup никак не влияет на Transaction Inventory Page, a sweep может продвинуть вперед OIT, но не более того. - Прим. науч. ред.
111
В версии 1.5 возможна передача оператора DDL в строке EXECUTE STATEMENT. Делайте это только в особых случаях.
112
Только в отношении работы конкретного запроса SQL, выполненного из клиентского приложения, в "недрах" которого произошла ошибка. Работа, выполненная ранее другими запросами SQL в этой же транзакции, будет сохранена (если транзакция завершится по commit). - Прим. науч. ред.
113
Начиная с версии 1.5. существует возможность объединять несколько событий в одном триггере. Подробности см. в главе 31.
114
В версии 1.5 LEAVE заменяет недокументированный оператор BREAK, который был частично реализован в версии 1.0.x. Не используйте BREAK.
115
Эта процедура является очень скромным примером программирования в PSQL. В SQL существует лучший способ проверить существование строк, чем их подсчет. В главе 32 мы снова будем обсуждать эту процедуру, выполнив некоторые изменения в ней, чтобы показать это. Если вы посмотрите исходные коды процедуры в базе данных, вы также заметите, что операторы SUSPEND и EXIT щедро разбросаны в разных местах, где они не нужны. Операторы SUSPEND и EXIT имеют идентичное использование в выполняемой процедуре. При этом в процедурах выбора оператор SUSPEND применяется особо. Для ясности и эффективности документирования предпочтительно исключить использование SUSPEND в качестве синонима EXIT.
116
ESQL, "супермножество" DSQL, имеет небольшое отличие в синтаксисе предложения INTO. Там INTO помещается сразу после ключевого слова SELECT и квантификатора строки (если присутствует). Водворение INTO В конец оператора в PSQL позволяет использовать наборы UNION В качестве входа для курсоров PSQL.
117
В Firebird 1.5 работа, выполняемая в данной вложенной процедуре, может быть реализована с помощью выражения CASE. Подробности см. в главе 21.
118
Клавдио Валдеррама (Claudio Valderrama) провел исследования по RDB$DB_KEY, именно его примеры здесь используются. Он живет в Чили, его псевдоним "robocop". Клавдио является официальным инспектором кода в проекте Firebird. Он поддерживает обширный сборник статей и кодов для Firebird и InterBase на своем сайте: http://www.cvalde.net.
119
Хотя триггеры "привязаны" к таблицам, некоторые инструменты выводят общий список триггеров для просмотра, сортируя его по именам триггеров. В этом случае следует выбрать иной способ формирования имени триггера (из имени таблицы, его типа и других характеристик), чтобы представление триггеров было отсортировано в нужном вам порядке. - Прим.
120
NEW.* и OLD.* также допустимы в DDL для ограничений CHECK на уровне таблицы - например, CREATE TABLE BLAH (ID INTEGER, DATA INTEGER, CONSTRAINT CHECK_INCR CHECK(NEW.DATA > OLD.DATA)).
121
В Firebird 2.0 модификация значений OLD. * явно запрещена и будет вызывать ошибку при попытке присвоения значений переменным OLL. * как при выполнении, так и при создании триггера, Также запрещена модификация значений NEW, * В триггерах AFТER. Прuм. науч. ред.
122
Некоторые компоненты интерфейса предоставляют методы или свойства для автоматического выполнения этой маленькой задачи.
123
Такая манипуляция будет гораздо более простой, если использовать внешнюю функцию для вычисления длины преобразованного целого числа. Я выбираю - может быть немного с другой точки зрения - демонстрацию того, что можно выполнить манипуляцию строками без использования внешних функций.
124
Поскольку проверки Foreign Key (FK) выполняются вне транзакций, а пользовательские триггеры работают всегда в контексте транзакций, полноценно заменить FK триггерами невозможно - из-за ограничений "видимости" триггер будет видеть старые данные, которые уже изменены. Приведенная схема будет работать, только если для справочной таблицы наложен ряд ограничений по удалению и изменению записей. - Прим. науч. ред.
125
Проектирование древовидных структур в реляционных базах данных само по себе является наукой. Будучи очаровательным, это все же выходит за пределы данного руководства. Найдите в Интернете написанную Joe Celko книгу на эту тему: Joe Celko's Trees and Hierarchies in SQL for Smarties (Morgan Kaufmann, 2004).
126
Ряд очень полезных статей по реализации древовидных структур в РСУБД вы сможете найти в соответствующем разделе страницы www.ibase.ru/develop.htm. - Прим. науч. ред.
127
Как показывает практика, такие переводы не приносят ожидаемой пользы разработчикам. Сообщения сервера ориентированы на разработчика приложений, и даже будучи переведенными, слишком сложны для восприятия пользователем программы. Более грамотным является корректная обработка ошибок, возникающих на сервере, в коде клиентского приложения, и выдача пользователю осмысленных и понятных сообщений в контексте прикладной области. Не составляет сложености в это же время сохранять исходные сообщения от сервера в специальном файле для последующего анализа корректности работы приложения - Прим. науч. ред.
128
См. APIGuide.pdf в комплекте документации по InterBase, опубликованной Borland Software Inc.
129
He следует путать с компонентами-обработчиками сообщений, которые инкапсулируют на клиентской стороне механизм событий.
130
Ресурс ibsurgeon.com предлагает не только средства ремонта баз данных, но с августа 2005 года и средство для восстановления поврежденных резервных копий баз данных. - Прим. науч. ред.
131
См. http://security.ucdavis.edu/HardenWin2Klab.pdf
132
Windows 2000 Security Handbook (Osborne-McGraw Hill, 2000) написана Philip Сох и Tom Sheldon. Биографию Philip Сох см. на http://www.systemexperts.com/bios.html.
133
Известным продуктом для шифрования сетевого трафика для Windows и Linux является ZeBeDee (www.ibase.ru/devinfo/zebedee.htm). -Прим. науч. ред.
134
По соображениям безопасности системы не должны поставляться вместе с библиотекой встроенного сервера, доступной для активного сервера Firebird, если только корневой каталог Firebird не защищен жестко от неавторизованных посетителей. Подробности см. ранее в главе
135
Несмотря на это в Firebird используется шифрование с потерей данных, которое не позволяет восстановить исходный пароль путем дешифрования. В Firebird 2.0 вместо DES используется MD5. - Прим. науч. ред.
136
Как уже говорилось ранее, шифрование пароля производится с потерей данных. Единственный способ, которым можно "взломать" пароль, - это перебор словаря, шифруемого тем же алгоритмом, что используется в Firebird. В данном случае время подбора существенно сокращается тем, что шифруемый пароль имеет длину не более 8 символов. - Прим. науч. ред.
137
Сервер просто не проверяет никакие права доступа для пользователя SYSDBA. В частности, поэтому операции над множеством объектов в SQL производятся от имени SYSDBA чуть быстрее, чем от имени других пользователей. - Прим. науч. ред.
138
Все версии InterBase и Firebird имеют весьма своеобразное поведение: если выдан GRANT на UPDATE к столбцам явно, то успешно может быть выполнен только UPDATE всей таблицы, без указания ограничения WHERE. Таким образом, выдача GRANT на UPDATE к конкретным столбцам является совершенно бесполезной. -Прим. науч. ред.
139
По причине ошибки в Windows использование DummyPacketlnterval может привести к зависанию или краху Windows на клиентской стороне. Объяснения см. в статье Microsoft Support: http://support.microsoft.com/default.aspx?kbid=296265. Не рекомендуется его также использовать и для систем, отличных от Windows, поскольку это может привести к отключению активного клиента.
140
Подробно по настройкам keepalive читайте статью www.ibase.ru/devinfo/keepalive.htm. - Прим. науч. ред.
141
Возможно, здесь ошибка - включение TCPJTODELAY как раз означает отключение алгоритма Nagle, то есть выключение режима буферизации данных при пересылке, чему соответствует установка параметра no_nagle в True. - Прим. науч. ред.
142
Здесь речь идет о порядке обработки параметров в запросах с подзапросами, содержащих параметры как во внешней части запроса, так и в подзапросе. В старых версиях InterBase и Firebird параметры заполнялись сначала для внешнего запроса, а потом для подзапроса, хотя по тексту запроса они располагаются наоборот. - Прим. науч. ред.
143
Общая библиотека UDF доступна на нескольких сайтах, включая http://www.ibphoenix.com.
144
В терминах C++ "по указателю".
145
Определена в ibase.h как blobcallback (структурный тип) и BLOBCALLBACK (указатель на структурный тип). Это объявление дает полное определение для функций чтения/записи указателей, которые упрощают использование их в современных компиляторах. См. также примечания перед объявлением в ibase.h.
146
При отсутствии ограничений на размещение внешних таблиц уже давно известны возможности использовать внешние таблицы как для перекачивания базы данных с сервера на клиент, так и для внедрения с клиента на сервер вредоносных UDF. - Прим. науч. ред.
147
SET NAMES, то есть набор символов соединения, должен быть задан до подсоединения к базе данных.
148
Вопросы безопасности файловой системы и других средств окружения обсуждаются в главах 33 и 34.
149
Если вы по-настоящему беспечны и оставите эти переменные окружения на рабочих станциях, показывая всему миру пароль пользователя SYSDBA, удаленные пользователи также смогут выполнять копирование, не задавая учетных данных. Нечего и говорить, что такая практика должна быть полностью исключена.
150
В некоторых случаях администраторы БД перенаправляют вывод gbak в утилиты упаковки, такие как gzip. Это позволяет "на лету" получить запакованную резервную копию базы данных с меньшей нагрузкой на диск в процессе создания или восстановления резервной копии. - Прим. науч. ред.
151
Информацию о стандарте XDR можно найти на http://asg.web.cmu.edu/rfc/rfcl832.html.
152
Будьте внимательны, -k обеспечивает не только восстановление БД без shadow, но и удаление существующих shadow с именами, сохраненными в файле резервной копии. Этот баг исправлен только в Firebird 2.0 (см. баг № 1122344 в багтрекере проекта Firebird: sf.net/projects/firebird). - Прим. науч. ред.
153
Это справедливо для InterBase 7.1/7.5 и Firebird 2.0. Для всех предыдущих версий InterBase и Firebird "зазор", выше которого стартует автоматический sweep, определяется как разница между OIT и OST (Oldest snapshot). - Прим. науч. ред.
154
После того как база данных переведена в состояние shutdown, к ней могут подключиться только пользователи SYSDBA и владелец базы данных (owner). Всем другим пользователям при попытке соединения с такой базой данных будет выдано соответствующее сообщение об ошибке. - Прим. науч. ред.
155
Количество соединений SYSDBA при состоянии базы данных shutdown ничем не ограничено. Только в Firebird 2.0 есть режим монопольноrо (только одноrо) подсоединения SYSDBA - Прuм, науч, ред.
156
Суффикс .gdb включен в filelist.xml, в список файлов, к которым применяется системное восстановление, располагающихся в каталоге Windows/System. К сожалению, из списка типы файлов не могут быть удалены. Это действует на базы данных Firebird, имеющие расширение gdb - системное восстановление приводит к замедлению начального соединения с подобными базами данных, и бывает, что это приводит к разрушению данных (подтвержденные
157
Информацию по ремонту баз данных можно найти здесь: http://www.ibase.ru/dbrepair.htrn и http://www.ibase.ru/devinfo/db_repair.htm. - Прим. науч. ред.
158
Для понимания темы Lock Print с благодарностью и признательностью отправляемся к Ann Harrison. Она была первой, кто подробно документировал этот полезный, но слабо освещенный инструмент поиска неисправностей, в официальном документе, написанный Ann для IBPhoenix. "Reading a Lock Print" можно найти в разделе документации на http://www.ibphoenix.com.
159
Самый последний вариант библиотеки FreeUDFLib с исправленными функциями BLOB находится на www.ibase.ru. - Прим. науч. ред.
160
Большинство современных приложений, в том числе офисных, требуют совместимости драйвера со спецификацией ODBC 3.5. Альтернативные драйверы ODBC также можно найти на www.ibase.ru. - Прим. науч. ред.
161
Кроме драйверов ODBC еще существуют драйверы OLEDB. Великолепный драйвер, который можно использовать из офисных приложений, Visual C++ и других инструментов, создан в Липецке: http://www.ibprovider.com/rus/index.htmI. - Прим. науч. ред.
162
Для получения этого драйвера обратитесь с запросом на адрес [email protected]. - Прим.
163
На момент перевода это версия 6.25. - Прим. перев.
164
Yaffil является ответвлением Firebird для Windows. Он был создан с открытыми кодами в конце 2003 года и затем был включен в коды Firebird 2.
165
Тем не менее на текущий момент практически никаких проблем при использовании IBX с Firebird 1.0, 1.5 и 2.0 нет. -Прим. науч. ред.
166
Во время написания этой книги автор услышала о первом случае нового способа разрушения баз данных. Жертва проигнорировала все советы и разместила базу данных в каталоге NFS. После этого продолжалось соединение клиентов с базой данных клиентов через два Классических сервера Firebird 1.5 с различных машин, ни одна из которых не была владельцем жесткого диска, на котором находилась база данных. В результате база данных была разру-
167
Полная коммерческая версия IBExpert бесплатна для использования в России и странах СНГ, там где в качестве кодировки по умолчанию для операционной системы Windows установлена таблица символов 1251. -Прим. науч. ред.
168
А также на сайте www.ibase.ru. - Прим. науч. ред.
169
На самом деле, как показывает практика, не более 16 000 столбцов INTEGER.- Прим. науч. ред.
170
Мало какие нынешние приложения переживут 19 января 2038 года - это проблема переполнения даты еще более худшая, чем проблема 2000 года. Устаревший формат даты в языке С (структура time t) не способен хранить года более 2038. С другой стороны, так долго приложения не эксплуатируются, а для внедряемой сейчас 64-битовой архитектуры и новых приложений такой проблемы нет. - Прим. науч. ред.
171
3 Это число больше реального числа, которое способна обеспечить операционная система. Например, RedHat Linux без изменения настроек и перекомпиляции ядра допускает до -600 соединений. Чаще всего проблема с числом соединений возникает из за "несконфигурированного" xinetd на Linux, где по умолчанию задано ограничение в -50-60 соединений на конкретное приложение. - Прим. науч. ред.
172
Реальное физическое ограничение на объем одной таблицы - 36.7 Гбайт. Это примерно 600 миллионов записей, состоящих из двух INTEGER Ограничение связано с внутренним 32-разрядным идентификатором. В Firebird 2.0 это ограничение устранено (используются 64(40)-битовые идентификаторы). - Прим. науч. ред.
173
В Firebird 2.0 максимальный размер ключа индекса- 1/4 размера страницы. Например, для страницы 4 Кбайт это 1024 байт. - Прим. науч. ред.
174
Полный комплект документации по InterBase 7.5 (на английском языке) поставляется только в электронном виде в составе серверной лицензии. Эти книги можно приобрести в печатном виде только поштучно ($25 за книгу). На русском языке существует только печатная документация по InterBase 5.6, поставляемая в комплекте IB 5.6 MediaK.it Rus. - Прим. науч. ред.
175
Полный комплект документации по InterBase 6.x, включая ReleaseNotes по всем версиям InterBase и Firebird, можно найти нa www.ibase.ru. -Прим. науч. ред.
176
На русском языке- "SQL", М. Грабер, издательство "Лори", дата выхода: 2001/2003, ISBN 5-85582-109-9. - Прим. науч. ред.
177
И для InterBase. - Прим. перев.
178
Не упомянут термин Oldest Snapshot Transaction (OST) - номер транзакции, которая была старейшей активной при старте самой старой активной на текущий момент транзакции SNAPSHOT. Именно этот номер препятствует сборке мусора. Расстояние между OIT и OST используется в Firebird 1.0 и 1.5 для определения момента старта автоматической чистки мусора (sweep). - Прим. науч. ред.
179
Это не так. Существует много систем, в которых номер OIT отстает от Next на несколько миллионов, при этом база данных работает нормально. "Застревание" OIT является индикацией того, что где-то в базе данных есть версии записей, отмененные по rollback, которые должны быть убраны как мусор принудительным запуском sweep. - Прим. науч. ред.
180
Сервер оценивает селективность как число, обратное разнице общего числа ключей и числа повторяющихся значений ключей индекса (от 0 до 1). Поэтому чем меньше значение селективности (столбец rdb$indices.rdb$statistics), тем лучше. Под "низкой" селективностью здесь имеется в виду селективность, стремящаяся к 1. Под "высокой" - стремящаяся к 0. - Прим. науч. ред.
181
Тем не менее большинство американских программистов говорят "сиквел". - Прим. перев.
182
Согласно Оксфордскому словарю английского языка аббревиатура SQL расшифровывается именно как Structured Query Language - структурированный язык запросов в отношении к базам данных. Прим. науч. ред.
183
Совершенно не относится к InterBase и Firebird, так как индексы в них построены на базе структур b-tree, a b-tree это не "binary tree". В то время как слова Хелен правильны в отношении binary tree, структуры b-tree по определению не могут быть "разбалансированы", т. к. количество узлов от корня до листа одинаково для всех ключей индекса и равно глубине индекса. Поэтому рекомендации по поводу "разбалансированности" индексов можно игнорировать. - Прим. науч. ред.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.