Firebird/ru: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Firebird/ru
| Old | New | Line | |
|---|---|---|---|
| 1 | + | Это руководство по использованию базы данных **Firebird** в Lazarus/FPC, с использованием Firebird с SQLDB (встроенная библиотека базы данных FPC/Lazarus). Другие методы доступа описаны в разделе [[Other Firebird libraries|Другие библиотеки Firebird]]. | |
| 2 | + | ||
| 3 | + | ## Обзор | |
| 4 | + | ||
| 5 | + | Firebird - это бесплатный сервер баз данных с открытым исходным кодом, который использовался и разрабатывался десятилетиями (он разрабатывался на основе базы данных Interbase 6, исходные коды которой были открыты компанией Borland). Он включает в себя расширенную поддержку операторов SQL (например, INSERT...RETURNING), хранимых процедур, триггеров и т.д. Вы можете написать скомпилированные библиотеки UDF (библиотеки пользовательских функций) для сервера в FreePascal, если вы хотите расширить и без того обширный список функций Firebird. | |
| 6 | + | ||
| 7 | + | База данных требует очень мало ручной работы администратора баз данных после того, как она настроена, что делает ее идеальной для использования в малом бизнесе или для встроенного использования. При правильной настройке он может вырасти до терабайтного масштаба, хотя PostgreSQL может быть лучшим выбором для таких больших сред. | |
| 8 | + | ||
| 9 | + | Firebird предлагает как встроенную (основанную на файлах), так и клиент-серверную базу данных - которую можно использовать без необходимости изменять одну строку кода в FPC/Lazarus. При использовании в качестве встроенной базы данных она предлагает более богатую поддержку SQL, чем [[SQLite]], а также плавную миграцию в базу данных клиент-сервер, хотя SQLite сама по себе является вполне встроенной базой данных. | |
| 10 | + | ||
| 11 | + | Последняя стабильная версия, Firebird 2.5 (прим.перев.: на момент перевода статьи - это версия Firebird 3.0.4), работает в Windows (32- и 64-разрядная версия), различных версиях Linux (32- и 64-разрядная версия), Solaris (Sparc и Intel), HP-UX (PA-Risc) и macOS. | |
| 12 | + | ||
| 13 | + | В настоящее время сервер портируется на Android; он пока недоступен в Windows CE/Windows Mobile. | |
| 14 | + | ||
| 15 | + | Поддержка Firebird в SQLDB компилятора довольно хорошая, сравнимая с уровнем поддержки [[postgres|PostgreSQL]]. | |
| 16 | + | ||
| 17 | + | ## Документация | |
| 18 | + | ||
| 19 | + | Официальная документация включена в FPC 2.6.2+: [Документация SQLDB для IBConnection](http://www.freepascal.org/docs-html/fcl/ibconnection/index.html) | |
| 20 | + | ||
| 21 | + | ## Установка режимов клиент/сервер и встроенного режима сервера | |
| 22 | + | ||
| 23 | + | Firebird может работать в режиме клиент/сервер и в режиме встроенного сервера. | |
| 24 | + | ||
| 25 | + | *Client/Server* означает, что у вас где-то есть физический сервер Firebird: либо на локальной машине, либо на другой машине, доступной по вашей сети. Соединения с сервером проходят через TCP/IP; при указании соединения имя хоста содержит имя или IP-адрес. Серверу Firebird для "общения" с вашими компонентами доступа необходима *fbclient.dll/fbclient.so.nnn* (*вместе с его файлами поддержки*). | |
| 26 | + | ||
| 27 | + | *Embedded Firebird* означает, что ваше приложение для доступа к базе данных Firebird на локальной машине загружает единственную библиотеку, которая является и сервером, и клиентской библиотекой Firebird "в одном флаконе". При указании строки соединения имя хоста всегда пусто (не указывается). Серверу Firebird для "общения" с вашими компонентами доступа необходима *fbembed.dll/fbembed.so* (*вместе с его файлами поддержки*). См. [[Firebird embedded|вики-страницу на Firebird embedded]] для более подробной информации. | |
| 28 | + | ||
| 29 | + | Обратите внимание, что *fbembed.dll* может использоваться как для клиент-серверного, так и для встроенного использования, поэтому установка только этой dll может быть разумной задачей. | |
| 30 | + | ||
| 31 | + | ------------------------------------------------------------------------ | |
| 32 | + | ||
| 33 | + | Прим.перев.: необходимо уточнить, что выше описанное справедливо для версий FB 1.5, FB 2.0, FB 2.1 и FB 2.5. Начиная с версии FB 3.0, режим используемого сервера зависит от строки подключения, а клиентская библиотека на все случаи жизни одна - все та же *fbclient.dll/libfbclient.so.3.0.n* (где n - номер билда версии FB). | |
| 34 | + | ||
| 35 | + | ------------------------------------------------------------------------ | |
| 36 | + | ||
| 37 | + | ### Windows | |
| 38 | + | ||
| 39 | + | Win64: пожалуйста, см. предупреждение [[Windows Programming Tips|здесь]] о нежелательном использовании некоторых версий FPC/Lazarus Win64. | |
| 40 | + | ||
| 41 | + | Для Windows: (это относится ко всем драйверам базы данных SQLDB) необходимо иметь *fbclient.dll* (или *fbembed.dll*' ) и его поддержку dll, установленных в: | |
| 42 | + | ||
| 43 | + | - каталог проекта **и** каталог вывода исполняемого файла/каталог приложения (например, lib /что-то еще в каталоге вашего проекта) | |
| 44 | + | - или каталог в вашем PATH (не в системном каталоге) | |
| 45 | + | - Если вы хотите использовать системный каталог, пожалуйста, используйте официальный установщик и поставьте галочку «скопировать fbclient в системный каталог» | |
| 46 | + | ||
| 47 | + | Как и для всех библиотек DLL (базы данных), разрядность библиотеки DLL должна соответствовать вашему приложению: используйте 32-разрядную библиотеку для 32-разрядной скомпилированной программы и 64-разрядную библиотеку для 64-разрядной программы. | |
| 48 | + | ||
| 49 | + | ### Unix/Linux/macOS | |
| 50 | + | ||
| 51 | + | В Linux/macOS/FreeBSD должна быть установлена клиентская библиотека Firebird (например, вашим менеджером пакетов; установите обычный пакет и пакет -dev), или они должны быть прописаны в путях поиска библиотеки. | |
| 52 | + | ||
| 53 | + | FPC ищет наиболее распространенные имена библиотек (например, libfbclient.so.2.5, libgds.so и libfbembed.so.2.5; пожалуйста, проверьте ibase60.inc, если ваша версия отличается). При желании можно указать имя библиотеки. Есть 2 способа сделать это: | |
| 54 | + | ||
| 55 | + | - использовать компонент [[TSQLDBLibraryLoader]] из sqldblib (FPC 2.7.1). Работает для всех компонентов коннектора SQLDB. | |
| 56 | + | - вызвать функцию | |
| 57 | + | ``` pascal | |
| 58 | + | function InitialiseIBase60(Const LibraryName : AnsiString) : integer; | |
| 59 | + | ``` | |
| 60 | + | ||
| 61 | + | с правильным именем библиотеки (для этого может потребоваться использовать модуль ibase60dyn). | |
| 62 | + | ||
| 63 | + | ## Примеры подключения | |
| 64 | + | ||
| 65 | + | 1\. Пример для client/server: | |
| 66 | + | ||
| 67 | + | `Hostname: 192.168.1.1`\ | |
| 68 | + | `* База данных находится на сервере с IP-адресом 192.168.1.1.`\ | |
| 69 | + | `DatabaseName: /interdata/example.fdb `\ | |
| 70 | + | `* Имя файла базы данных - "example.fdb" в каталоге /interdata сервера (машина с IP-адресом 192.168.1.1).`\ | |
| 71 | + | `Username: SYSDBA`\ | |
| 72 | + | `Password: masterkey` | |
| 73 | + | ||
| 74 | + | 2\. Другой пример client/server: | |
| 75 | + | ||
| 76 | + | `Hostname: dbhost`\ | |
| 77 | + | `* База данных находится на сервере с именем хоста dbhost`\ | |
| 78 | + | `DatabaseName: F:\Program Files\firebird\examples\employee.fdb `\ | |
| 79 | + | `* Имя файла базы данных - "employee.fdb" в каталоге Program Files\firebird\examples на диске F: dbhost.`\ | |
| 80 | + | `Username: SYSDBA`\ | |
| 81 | + | `Password: masterkey` | |
| 82 | + | ||
| 83 | + | 3\. Пример для embedded-режима: | |
| 84 | + | ||
| 85 | + | `Hostname: <пустая строка>`\ | |
| 86 | + | `* Оставляя имя хоста пустым, выбирается embedded-режим.`\ | |
| 87 | + | `DatabaseName: test.fdb`\ | |
| 88 | + | `* Файл базы данных "test.fdb" находится в каталоге запускаемого приложения (убедитесь, что fbembed.dll находится в каталоге исполняемого файла приложения)`\ | |
| 89 | + | `Username: SYSDBA`\ | |
| 90 | + | `* Для встроенного сервера вы должны указать имя пользователя ...`\ | |
| 91 | + | `Password: <пустая строка> (`прим.перев.`: вообще-то, это может быть любая строка, в т.ч. и пустая)`\ | |
| 92 | + | `* ... но не важно, какой пароль вы укажете.` | |
| 93 | + | ||
| 94 | + | ------------------------------------------------------------------------ | |
| 95 | + | ||
| 96 | + | Прим.перев.: выше приведенные примеры подразумевают, что используется порт по умолчанию 3050. Если номер порта отличается от стандартного (например, пусть будет 3051), то для каждого из выше приведенных примеров строка подключения (например, к утилите *isql*) соответственно будет выглядеть следующим образом: | |
| 97 | + | ||
| 98 | + | ``` bash | |
| 99 | + | SQL>connect '192.168.1.1/3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey'; | |
| 100 | + | ``` | |
| 101 | + | ||
| 102 | + | ``` bash | |
| 103 | + | SQL>connect 'dbhost/3051:F:\Program Files\firebird\examples\employee.fdb' -user 'SYSDBA' -password 'masterkey'; | |
| 104 | + | ``` | |
| 105 | + | ||
| 106 | + | ``` bash | |
| 107 | + | SQL>connect 'test.fdb' -user 'SYSDBA' -password ''; | |
| 108 | + | ``` | |
| 109 | + | ||
| 110 | + | Начиная с версии FB 3 появилась возможность указывать другие протоколы коннекта: | |
| 111 | + | ||
| 112 | + | - **INET**-протокол (для TCP/IP) в виде строки `<host>[/<port>]:<database file path or alias>` | |
| 113 | + | ||
| 114 | + | Тогда строка подключения (например, к утилите *isql*) для выше указанных примеров соответственно будет выглядеть так: | |
| 115 | + | ||
| 116 | + | ``` bash | |
| 117 | + | SQL>connect 'inet://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey'; | |
| 118 | + | ``` | |
| 119 | + | ||
| 120 | + | ``` bash | |
| 121 | + | SQL>connect 'inet://dbhost:3051:F:\Program Files\firebird\examples\employee.fdb' -user 'SYSDBA' -password 'masterkey'; | |
| 122 | + | ``` | |
| 123 | + | ||
| 124 | + | ``` bash | |
| 125 | + | SQL>connect 'inet://test.fdb' -user 'SYSDBA' -password ''; | |
| 126 | + | ``` | |
| 127 | + | ||
| 128 | + | INET-протокол поддерживает *URL-стиль* (для адресов IPv4 и IPv6) строки подключения вы виде шаблона `[<protocol>://[<host>[:<port>]]]/<database file path or alias>`. Тогда в строке подключения часть строки заменяется с *inet://* на *inet4://* или *inet6://* соответственно. Например: | |
| 129 | + | ||
| 130 | + | ``` bash | |
| 131 | + | SQL>connect 'inet6://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey'; | |
| 132 | + | ``` | |
| 133 | + | ||
| 134 | + | > **Note:** по умолчанию Firebird прослушивает нулевой адрес IPv6 (: :) и принимает все входящие соединения, будь то IPv4 или IPv6. Если эти адреса имеют ненулевое значение, то в строке подключения они обрамляются квадратными скобками, чтобы устранить двусмысленность при использовании двоеточия в качестве разделителя | |
| 135 | + | ||
| 136 | + | . | |
| 137 | + | ||
| 138 | + | Например, если `IPv6 = 2014:1234::5`, то строка подключения примет вид: | |
| 139 | + | ||
| 140 | + | ``` bash | |
| 141 | + | SQL>connect '[2014:1234::5]://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey'; | |
| 142 | + | ``` | |
| 143 | + | ||
| 144 | + | и далее по аналогии... | |
| 145 | + | ||
| 146 | + | - протокол NetBEUI, или **WNET** (именованные каналы) - **только для Windows!** - в виде строки `\\<host>[@<port>]\<database file path or alias>`. | |
| 147 | + | - протокол **XNET** для локальных подключений с использованием общей памяти. | |
| 148 | + | ||
| 149 | + | Последние два протокола имеют строку подключения, аналогичную INET, только вместо *inet://* подставляются *wnet://* или *xnet://* соответственно. | |
| 150 | + | ||
| 151 | + | Более подробную информацию по нововведениям FB 3, в том числе и по протоколам коннекта можно посмотреть [здесь](http://www.ibase.ru/files/firebird/Firebird_v3.0.3.ReleaseNotes.pdf). | |
| 152 | + | ||
| 153 | + | ------------------------------------------------------------------------ | |
| 154 | + | ||
| 155 | + | ## Устранение проблем с доступом client/server | |
| 156 | + | ||
| 157 | + | Убедитесь, что вы запустили сервер Interbase/Firebird на указанном вами IP-адресе/имени хоста сервера. Вы можете проверить подключение, подключившись к компьютеру через telnet. Firebird обычно слушает порт 3050: | |
| 158 | + | ||
| 159 | + | ``` bash | |
| 160 | + | telnet 192.168.1.1 3050 | |
| 161 | + | ``` | |
| 162 | + | ||
| 163 | + | Вы должны увидеть что-то, может быть, просто пустой экран, но вы можете что-то напечатать. Это означает, что вы можете отправлять данные в базу данных Firebird. | |
| 164 | + | ||
| 165 | + | Для получения дополнительной информации см. документацию Firebird. | |
| 166 | + | ||
| 167 | + | ## Мониторинг событий | |
| 168 | + | ||
| 169 | + | FPC/Lazarus поставляется с компонентом для мониторинга событий, поступающих из баз данных Firebird; см. [[TFBEventMonitor]]. | |
| 170 | + | ||
| 171 | + | ## Программное создание объектов | |
| 172 | + | ||
| 173 | + | Хотя для создания таблиц и т.д. можно использовать такие инструменты, как Flamerobin (прим.перев.: для windows, особенно русскоязычной, предпочтительнее использовать IBExpert), вы также можете создавать объекты БД программно/динамически, что может быть удобно, если вы хотите, чтобы ваши программы обновляли существующие схемы базы данных до новой схемы. | |
| 174 | + | ||
| 175 | + | Вы можете использовать, например, TSQLQuery.ExecSQL для выполнения этой задачи: | |
| 176 | + | ||
| 177 | + | ``` pascal | |
| 178 | + | Query.ExecSQL('CREATE TABLE TEST(ID INTEGER NOT NULL, TESTNAME VARCHAR(800))'); | |
| 179 | + | // Вам необходимо закомиттить транзакцию после DDL перед любыми инструкциями DML - SELECT, INSERT и т. Д. | |
| 180 | + | //В противном случае SQL не увидит созданные объекты | |
| 181 | + | ``` | |
| 182 | + | ||
| 183 | + | Используйте для этих целей объект TSQLScript - см. [[TSQLScript]]. | |
| 184 | + | ||
| 185 | + | ## Администрирование базы данных | |
| 186 | + | ||
| 187 | + | У FPC/Lazarus есть компонент для администрирования базы данных; см. [[TFBAdmin]] | |
| 188 | + | ||
| 189 | + | ## Общие проблемы и решения | |
| 190 | + | ||
| 191 | + | Иногда использование Firebird в Lazarus кажется сложным. Пожалуйста, поищите решения ниже по тексту. | |
| 192 | + | ||
| 193 | + | ### Попытка обновления доступного только для чтения столбца / полей COMPUTED BY | |
| 194 | + | ||
| 195 | + | Если в вашей таблице Firebird есть поля COMPUTED BY (вычисляемые поля на стороне сервера), SQLDB не будет брать в расчет, что это поля только для чтения (из соображений производительности). | |
| 196 | + | ||
| 197 | + | В этом случае автоматически сгенерированные операторы INSERTSQL, UPDATESQL могут привести к сообщениям об ошибках, таких как "attempted update of read-only column" (попытка обновления столбца только для чтения).Решение состоит в том, чтобы вручную указать, что данное поле не может быть обновлено после установки свойства SQL в TSQLQuery, что-то вроде: | |
| 198 | + | ||
| 199 | + | ``` pascal | |
| 200 | + | // Отключаем обновление этого поля или поиск измененных значений, поскольку пользователь не может изменить его | |
| 201 | + | sqlquery1.fieldbyname('full_name').ProviderFlags:=[]; | |
| 202 | + | ``` | |
| 203 | + | ||
| 204 | + | ### Bigint: потеря точности | |
| 205 | + | ||
| 206 | + | Если вы используете тип данных bigint (64-битное целое число со знаком) в Firebird, пожалуйста, используйте .AsLargeInt вместо .AsInteger для параметров: | |
| 207 | + | ||
| 208 | + | ``` pascal | |
| 209 | + | // Предполагая, что идентификатор здесь bigint | |
| 210 | + | sqlquery1.sql.text := 'insert into ADDRESS (ID) values (:ID)'; | |
| 211 | + | // делаем так: | |
| 212 | + | sqlquery1.params.parambyname('ID').aslargeint := <любая qword- или 64-bit integer-переменная>; | |
| 213 | + | // Не делайте так: | |
| 214 | + | //sqlquery1.params.parambyname('ID').asinteger := <любая qword- или 64-bit integer-переменная>; | |
| 215 | + | ... | |
| 216 | + | ``` | |
| 217 | + | ||
| 218 | + | ... в противном случае вы можете получить такие ошибки, как дубликат PK (первичного ключа) - при использовании bigint в качестве первичного ключа. | |
| 219 | + | ||
| 220 | + | ### Логические типы данных | |
| 221 | + | ||
| 222 | + | Версии Firebird ниже 3.0 не поддерживают логические типы данных. | |
| 223 | + | ||
| 224 | + | По крайней мере, в транке FPC (2.7.1) этот тип данных можно эмулировать: | |
| 225 | + | ||
| 226 | + | Используйте домен, который использует тип SMALLINT (другие целочисленные типы также могут работать - пожалуйста, протестируйте и настройте текст): | |
| 227 | + | ||
| 228 | + | ``` SQL | |
| 229 | + | CREATE DOMAIN "BOOLEAN" | |
| 230 | + | AS SMALLINT | |
| 231 | + | CHECK (VALUE IS NULL OR VALUE IN (-1,0,1)) | |
| 232 | + | /* -1 используется для совместимости с SQLDB FPC; 1 используется многими другими слоями доступа к данным */ | |
| 233 | + | ; | |
| 234 | + | ``` | |
| 235 | + | ||
| 236 | + | Позвольте вашему полю/столбцу использовать этот тип домена, например | |
| 237 | + | ||
| 238 | + | ``` SQL | |
| 239 | + | CREATE TABLE MYTABLE | |
| 240 | + | ( | |
| 241 | + | ... | |
| 242 | + | MYBOOLEANCOLUMN "BOOLEAN", | |
| 243 | + | ); | |
| 244 | + | ``` | |
| 245 | + | ||
| 246 | + | - Теперь вы можете использовать .AsBoolean для присвоения значений полей и т.д. | |
| 247 | + | ||
| 248 | + | **To do: убедитесь, что это работает с гридами Lazarus и т. д..** | |
| 249 | + | ||
| 250 | + | ### Проблемы INSERT INTO...RETURNING/Не открытый курсор | |
| 251 | + | ||
| 252 | + | Если вы попытаетесь сделать выборку SQL (например, Query.Open) в следущем SQL-запросе: | |
| 253 | + | ||
| 254 | + | ``` SQL | |
| 255 | + | INSERT INTO PEOPLE (NICKNAME) VALUES ('Superman') RETURNING ID | |
| 256 | + | ``` | |
| 257 | + | ||
| 258 | + | и получаете что-то вроде этой ошибки: | |
| 259 | + | ||
| 260 | + | ```dos | |
| 261 | + | Database error: : Fetch : | |
| 262 | + | -Dynamic SQL Error | |
| 263 | + | -SQL error code = -504 | |
| 264 | + | -Invalid cursor reference | |
| 265 | + | -Cursor is not open(error code: 335544569) | |
| 266 | + | ``` | |
| 267 | + | ||
| 268 | + | во время работы FPC 2.6.0 (которая поставляется с Lazarus 1.0) или ниже, вы, вероятно, столкнулись с ошибкой синтаксического парсера FPC SQLDB. | |
| 269 | + | ||
| 270 | + | SQLDB считает, что выполняемый вами оператор является обычным оператором INSERT, который не возвращает данные. Очевидно, он должен возвращать данные. В более новом FPC для этого кода уже внесены исправления. | |
| 271 | + | ||
| 272 | + | Если вы используете генераторы/последовательности для своих первичных ключей (как это делают многие), в качестве обходного пути вы должны сначала получить следующий порядковый номер: | |
| 273 | + | ||
| 274 | + | ``` SQL | |
| 275 | + | SELECT NEXT VALUE FOR GEN_PEOPLEID FROM RDB$DATABASE /* Если имя вашего генератора GEN_PEOPLEID */ | |
| 276 | + | ``` | |
| 277 | + | ||
| 278 | + | затем используйте это, чтобы сделать обычный INSERT. см. [FAQ entry](http://www.firebirdfaq.org/faq111/%7CFirebird) | |
| 279 | + | ||
| 280 | + | ------------------------------------------------------------------------ | |
| 281 | + | ||
| 282 | + | Прим.перев.: вообще-то, мягко говоря, немного странный совет. Гораздо проще и безопаснее создать в БД триггер BeforeInsert примерно следующего содержания: | |
| 283 | + | ||
| 284 | + | ``` sql | |
| 285 | + | /* Trigger: TBL_PEOPLE_BI */ | |
| 286 | + | CREATE OR ALTER TRIGGER TBL_PEOPLE_BI FOR TBL_PEOPLE | |
| 287 | + | ACTIVE BEFORE INSERT POSITION 0 | |
| 288 | + | AS | |
| 289 | + | BEGIN | |
| 290 | + | /* генерируем новое значение поля, если вставляемое является NULL-значением */ | |
| 291 | + | IF (NEW.ID IS NULL) THEN | |
| 292 | + | NEW.ID = GEN_ID(GEN_PEOPLEID,1); | |
| 293 | + | END | |
| 294 | + | ^ | |
| 295 | + | ``` | |
| 296 | + | ||
| 297 | + | чтобы переложить заботу о генерации PK на плечи сервера, передавая с клиента NULL-значение генератора (или не передавая его вообще, что будет восприниматься сервером, как NULL). | |
| 298 | + | ||
| 299 | + | ------------------------------------------------------------------------ | |
| 300 | + | ||
| 301 | + | ### Locate, кажется, не работает | |
| 302 | + | ||
| 303 | + | Источник: [Issue \##21988](https://bugs.freepascal.org/view.php?id=#21988) | |
| 304 | + | ||
| 305 | + | При запуске locate в CHAR-полях с UTF8 (или, возможно, других многобайтовых символов), locate может не найти вашу запись. | |
| 306 | + | ||
| 307 | + | Проблема в основном связана с используемой кодировкой UTF8 и тем, как Firebird сообщает о длине столбца. В случае UTF8 Firebird сообщает о максимальной длине столбца (в байтах) как 4 * «размер символа». Поэтому, если у вас есть столбец, определенный как char(8), Firebird сообщает 4*8=32. | |
| 308 | + | ||
| 309 | + | Значения "добиваются" пробелами справа до этой длины 32. При поиске, скажем, «57200001», совпадений нет, потому что в поле фактически хранится «57200001 ........................» (с конечными пробелами, представленными здесь точками ). | |
| 310 | + | ||
| 311 | + | Обходной путь: перепишите ваш select-запрос: | |
| 312 | + | ||
| 313 | + | ``` sql | |
| 314 | + | SELECT substring(THEFIELD from 1 for 8) AS THEFIELD ... | |
| 315 | + | ``` | |
| 316 | + | ||
| 317 | + | или | |
| 318 | + | ||
| 319 | + | ``` sql | |
| 320 | + | SELECT cast(THEFIELD as varchar(8)) as THEFIELD ... | |
| 321 | + | ``` | |
| 322 | + | ||
| 323 | + | или используйте VARCHAR-тип полей. | |
| 324 | + | ||
| 325 | + | > **Note:** эта проблема может возникать и для других баз данных, в зависимости от их возвращаемой длины. | |
| 326 | + | ||
| 327 | + | ## Подробнее о транзакциях | |
| 328 | + | ||
| 329 | + | Источники для этой информации / дальнейшего чтения: | |
| 330 | + | ||
| 331 | + | - [Понимание транзакций Firebird](http://www.ibphoenix.com/resources/documents/how_to/doc_400) - очень детальная статья (англ.) | |
| 332 | + | - [Транзакции в Firebird](https://ib-aid.com/en/transactions-in-firebird-acid-isolation-levels-deadlocks-and-update-conflicts-resolution/) другая очень детальная статья (англ.) (прим.перев.: русскоязычные аналоги от тех же авторов [Жизненный цикл транзакций](http://www.ibase.ru/utl/) и [Транзакции в InterBase и Firebird](http://www.ibase.ru/ibtrans/)) | |
| 333 | + | - Руководство по Interbase 6 API (справедливо для Firebird+Interbase), стр. 63 и далее | |
| 334 | + | - [Обзор настроек транзакций в Interbase](http://conferences.embarcadero.com/article/32280) (англ.) | |
| 335 | + | - [Подробное объяснение параметров в Firebird](http://tech.groups.yahoo.com/group/firebird-support/message/58653) (англ.) | |
| 336 | + | - [Обзор настроек в Firebird](http://fhasovic.blogspot.com/2005/02/transaction-isolation-levels-in.html) (англ.) | |
| 337 | + | - [Уровни изоляции транзакции в FIBPlus](http://delphi-help.ru/index.php?option=com_k2&view=item&id=309:rabota-s-tranzaktsiyami-i-ih-ispolzovanie-v-fibplus-chast-2&Itemid=55) (прим.перев.: ссылки на devrace'овские статьи, как и сам оригинальный сайт, увы, давно мертвы, остались лишь сохраненные статьи на сторонних ресурсах) | |
| 338 | + | - README.set_transaction.txt в папке с документацией Firebird 2.5. | |
| 339 | + | ||
| 340 | + | ### Уровни изоляции транзакций | |
| 341 | + | ||
| 342 | + | Если вы хотите, вы можете изменить уровни изоляции транзакции, добавив строку в свойстве Parameters транзакции: | |
| 343 | + | ||
| 344 | + | - `isc_tpb_read_committed`: вы видите все изменения, закомиченные другими транзакциями | |
| 345 | + | - `isc_tpb_concurrency`: также называется Снапшотом (моментальным снимком): вы видите базу данных такой, какой она была при запуске транзакции. Имеет больше накладных расходов, чем isc_tpb_read_committed. Лучше, чем ANSI Serializable, потому что не имеет фантомных чтений. | |
| 346 | + | - `isc_tpb_consistency`: также называется Table Stability: стабильное, сериализуемое представление данных, но блокирует таблицы. Вряд ли вам это понадобится. | |
| 347 | + | ||
| 348 | + | Пример: | |
| 349 | + | ||
| 350 | + | ``` pascal | |
| 351 | + | SQLTransaction1.Params.text:='isc_tpb_read_committed'; | |
| 352 | + | ``` | |
| 353 | + | ||
| 354 | + | Вы также можете добавить дополнительные параметры, которые влияют на транзакцию (взятые из исходного файла ibconnection.pp и [1](http://conferences.embarcadero.com/article/32280)): | |
| 355 | + | ||
| 356 | + | ### Режим доступа | |
| 357 | + | ||
| 358 | + | Этот параметр позволяет или только чтение, или чтение/запись | |
| 359 | + | ||
| 360 | + | - `isc_tpb_read`: разрешение на чтение | |
| 361 | + | - `isc_tpb_write`: разрешение на чтение+запись | |
| 362 | + | ||
| 363 | + | ### Обработка конфликтов блокировки | |
| 364 | + | ||
| 365 | + | - `isc_tpb_nowait`: текущая транзакция откатывается с сообщением о конфликте, если запись все еще редактируется другой транзакцией | |
| 366 | + | - `isc_tpb_wait`: если запись все еще редактируется другой транзакцией, текущая транзакция дожидается завершения работы той, первой транзакции. Может смягчить «долгоживущие блокировки» в условиях сильной конкуренции ([2](http://tech.groups.yahoo.com/group/firebird-support/message/58653)). См. ниже описание параметра timeout value. | |
| 367 | + | ||
| 368 | + | ### Резервирование таблиц | |
| 369 | + | ||
| 370 | + | Соглашение по блокировкам таблиц в целом. | |
| 371 | + | ||
| 372 | + | - `isc_tpb_shared`: сначала указывается этот параметр, затем либо lock_read, либо lock_write для одной или нескольких таблиц. Разделяемый режим чтения или записи для таблиц. | |
| 373 | + | - `isc_tpb_protected`: сначала указывается этот параметр, затем либо lock_read, либо lock_write для одной или нескольких таблиц. Блокировка на таблицы; может разрешить операции без блокировок за счет отложенных транзакций. | |
| 374 | + | - `isc_tpb_lock_read`: задает блокировку чтения. Указывается, какая таблица блокируется, например, isc_tpb_lock_read=CUSTOMERS | |
| 375 | + | - `isc_tpb_lock_write`: задает блокировку чтения/записи. Указывается, какая таблица блокируется, например, isc_tpb_lock_read=CUSTOMERS | |
| 376 | + | ||
| 377 | + | Комбинации: | |
| 378 | + | ||
| 379 | + | - Shared, lock_write: пишущая транзакция с уровнем изоляции concurrency или read committed может обновлять таблицу. Читать таблицу может любая транзакция (прим.перев.: только в режиме READ ONLY (read)). | |
| 380 | + | - Shared, lock_read: читать и обновлять таблицу может любая транзакция. | |
| 381 | + | - Protected, lock_write: Другие транзакции не могут обновлять таблицу. Читать таблицу могут только транзакции concurrency или read committed. | |
| 382 | + | - Protected, lock_read: Другие транзакции не могут обновлять таблицу, но могут ее читать. | |
| 383 | + | ||
| 384 | + | ### Версионность записей | |
| 385 | + | ||
| 386 | + | Этот параметр, по-видимому, относится только к режиму изоляции isc_tpb_read_committed для записей, изменяемых другими транзакциями: | |
| 387 | + | ||
| 388 | + | - `isc_tpb_no_rec_version`: читается только самая новая версия записи. Может быть полезно для операций пакетной/массовой вставки вместе с isc_tpb_read_committed. | |
| 389 | + | - `isc_tpb_rec_version`: читается последняя подтвержденная версия записи, даже если в другой транзакции есть другие незакомиченные изменения. Больше накладных расходов, чем isc_tpb_no_rec_version. | |
| 390 | + | ||
| 391 | + | ### Различные варианты | |
| 392 | + | ||
| 393 | + | Для полноты, в коде Firebird/Interbase FPC появилось еще несколько опций. Скорее всего, вы будете использовать isc_tpb_no_auto_undo только для ускорения вставки/редактирования пакетов. | |
| 394 | + | ||
| 395 | + | - isc_tpb_exclusive (видимо переводится как защищенный в Firebird, см. [3](http://tech.groups.yahoo.com/group/firebird-support/message/58653)) | |
| 396 | + | - isc_tpb_verb_time (Относится к отложенным ограничениям, которые могут выполняться в verb time или во время коммита. Firebird: не реализовано, всегда используйте verb time) | |
| 397 | + | - isc_tpb_commit_time (Относится к отложенным ограничениям, которые могут выполняться в verb time или в commit time. Firebird: не реализовано, всегда используйте verb time) | |
| 398 | + | - isc_tpb_ignore_limbo (игнорирует записи, созданные limbo-транзакциями. limbo-транзакции - это незавершенные транзакции в двухфазном коммите при работе с несколькими базами данных. Вряд ли вам понадобится эта функция) | |
| 399 | + | - isc_tpb_autocommit (автокоммит транзакции: каждый оператор является отдельной транзакцией. Вероятно, специально для драйвера JDB JayBird.) | |
| 400 | + | - isc_tpb_restart_requests (очевидно, ищет запросы в соединении, которые были активны в другой транзакции, прибивает их и перезапускает в новой транзакции.) | |
| 401 | + | - isc_tpb_no_auto_undo (отключает журнал отмен на уровне транзакций, что удобно для получения максимальной пропускной способности при выполнении пакетного обновления. Не имеет эффекта при данных только для чтения.) | |
| 402 | + | - isc_tpb_lock_timeout (укажите количество секунд ожидания для снятия блокировки, если вы используете isc_tpb_wait. Если это значение достигнуто без снятия блокировки, выдается сообщение об ошибке.) | |
| 403 | + | ||
| 404 | + | ### Firebird и транзакции по стандарту ANSI/ISO SQL | |
| 405 | + | ||
| 406 | + | Транзакции Firebird не соответствуют 1 в 1 уровню транзакции стандарта ISO/ANSI. Приблизительно так: | |
| 407 | + | ||
| 408 | + | - ISO Read Committed=READ COMMITTED+RECORD_VERSION | |
| 409 | + | - ISO Read Committed=READ COMMITTED+NO RECORD_VERSION | |
| 410 | + | - ISO Repeatable Read=SNAPSHOT (также известная как CONCURRENCY) | |
| 411 | + | - ISO Serializable=SNAPSHOT TABLE STABILITY (также известная как CONSISTENCY) | |
| 412 | + | ||
| 413 | + | ### Общие комбинации | |
| 414 | + | ||
| 415 | + | По умолчанию (возможно, придется проверить) read committed. | |
| 416 | + | ||
| 417 | + | #### Пакетная/массовая вставка | |
| 418 | + | ||
| 419 | + | isc_tpb_read_committed и isc_tpb_no_rec_version могут быть хорошей комбинацией: она позволяет другим транзакциям функционировать во время выполнения пакетной вставки. | |
| 420 | + | ||
| 421 | + | #### Транзакции только для чтения | |
| 422 | + | ||
| 423 | + | Если вы хотите иметь доступ только для чтения к базе данных, вы можете сделать это, установив следующие параметры транзакции: | |
| 424 | + | ||
| 425 | + | - `isc_tpb_read` | |
| 426 | + | - `isc_tpb_read_committed` | |
| 427 | + | - `isc_tpb_rec_version` | |
| 428 | + | - `nowait` | |
| 429 | + | ||
| 430 | + | Эта комбинация не будет блокировать сборку мусора, что само по себе хорошо. Источник: [4](http://tech.groups.yahoo.com/group/firebird-support/message/118748) | |
| 431 | + | ||
| 432 | + | > **Note:** [Firebird FAQ](http://www.firebirdfaq.org/faq164/) указывает, что вам понадобится доступ с правом записи в файл базы данных, даже если вы только читаете из него, если вы не установите флаг базы данных read-only \[только для чтения\] (например, с помощью утилиты gfix). | |
| 433 | + | ||
| 434 | + | ## Ссылки и дополнительная информация | |
| 435 | + | ||
| 436 | + | В списке ниже приведены ссылки на дополнительную информацию о Firebird и связанных с ней инструментах. | |
| 437 | + | ||
| 438 | + | - [[Firebird embedded/ru|Использование Firebird embedded с приложениями FPC/Lazarus]] | |
| 439 | + | ||
| 440 | + | ### Примеры Lazarus Firebird | |
| 441 | + | ||
| 442 | + | - Примеры исходного кода приложения Lazarus/Firebird [5](http://lazarus.freepascal.org/index.php/topic,13940.msg73617.html#msg73617) | |
| 443 | + | - Учебники Firebird/SQLDB: | |
| 444 | + | - [[SQLdb Tutorial0]] | |
| 445 | + | - [[SQLdb Tutorial1]] | |
| 446 | + | - [[SQLdb Tutorial2]] | |
| 447 | + | - [[SQLdb Tutorial3]] | |
| 448 | + | - [[SQLdb Tutorial4]] | |
| 449 | + | ||
| 450 | + | - Учебники по PP4S; включает установку Firebird на Windows, а также | |
| 451 | + | - [Планирование базы данных (англ.)](http://www.pp4s.co.uk/main/tu-db-plan.html) | |
| 452 | + | - [Установка Firebird (англ.)](http://www.pp4s.co.uk/main/tu-db-installingfirebird01.html) | |
| 453 | + | - [Создание базы данных Firebird (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-create.html) | |
| 454 | + | - [Редактирование базы данных Firebird (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-demo1.html) | |
| 455 | + | - [Поиск в базе данных Firebird (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-demo2.html) | |
| 456 | + | - [Создание и печать отчетов (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-demo3.html) | |
| 457 | + | - [Создание и использование хранимых процедур (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-demo4.html) | |
| 458 | + | ||
| 459 | + | ### Инструменты администрирования | |
| 460 | + | ||
| 461 | + | - [FlameRobin](http://www.flamerobin.org/) - GUI инструмент с открытым исходным кодом для управления Firebird, доступный для Linux, Windows и macOS. Настоятельно рекомендуется. | |
| 462 | + | - [Turbobird](https://github.com/motaz/turbobird) - GUI инструмент с открытым исходным кодом для управления Firebird. Написано с помощью Lazarus с использованием TIBConnection. | |
| 463 | + | - ibconsole : инструмент для управления Firebird и базами данных Interbase с графическим интерфейсом, доступен для Windows и Linux. | |
| 464 | + | - Lazarus Data Desktop - входит в репозиторий Lazarus (находится в каталоге 'tools/lazdatadesktop/'). | |
| 465 | + | - [LazSQLX](http://lazsqlx.wordpress.com/)- многофункциональный инструмент управления базами данных с открытым исходным кодом. Написан на Lazarus с использованием компонентов как SQLDB, так и Zeos. Включает поддержку Firebird. | |
| 466 | + | - tiSQLEditor - включен в каталог «Support Apps» репозитория [[tiOPF]]. Это инструмент, используемый для написания SQL с некоторой поддержкой автозавершения кода, может запускать сценарии, выполнять сценарии обновления для приложений от одной сборки до более поздней сборки, имеет различные удобные функции копирования и вставки для приложений Object Pascal, имеет много функций, которые полезны для tiOPF (создает шаблоны кода Object Pascal из результатов запросов, для классов посетителей tiOPF), экспортирует результаты запросов в CSV и т.д. | |
| 467 | + | - Прим.перев.: [IBExpert](http://www.ibexpert.net/ibe/) - ИМХО, лучший GUI-инструмент для администрирования БД Firebird под Windows. Постоянно обновляемый, с активным [русскоязычным коммунити](https://www.sql.ru/forum/ibexpert), бесплатен для пользователей Windows с кодовой страницей *Win1251* (в основном, жителей exUSSR). В комплекте SQL-редактор с подсветкой синтаксиса и автозавершением слов, редактор скриптов, построитель запросов, поддержка IBEScript, менеждер прав и пользователей, печать и экспорт данных в различные форматы и проч.проч. Скачать можно по прямой ссылке [здесь](http://www.ibexpert.com/rus/ibe_sfx.exe) в виде самораспаковывающегося архива. Документация представлена [здесь](http://www.ibexpert.net/ibe/index.php?n=Doc.Doc). | |
| 468 | + | ||
| 469 | + | ### Firebird | |
| 470 | + | ||
| 471 | + | - РСУБД [Firebird](http://firebirdsql.org/). Этот сайт также содержит много документации по Firebird. | |
| 472 | + | - Firebird [FAQ](http://firebirdfaq.org/). Удобный сайт, который показывает, например, отличия от других РСУБД. | |
| 473 | + | - [Новый сайт](http://www.controlpascal.com/firebird.htm), который показывает, как использовать новейшие инструменты и LibreOffice, FPC будет добавлен в ближайшее время. | |
| 474 | + | ||
| 475 | + | \ | |
| 476 | + | ||
| 477 | + | --- | |
| 478 | + | *From the Free Pascal wiki, page "Firebird/ru", as it stood on 2020-02-16 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
