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