Sign in Join
Wiki copytemporary

Firebird/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Это руководство по использованию базы данных **Firebird** в Lazarus/FPC, с использованием Firebird с SQLDB (встроенная библиотека базы данных FPC/Lazarus). Другие методы доступа описаны в разделе [[Other Firebird libraries|Другие библиотеки Firebird]].
22
33## Обзор
44
55Firebird - это бесплатный сервер баз данных с открытым исходным кодом, который использовался и разрабатывался десятилетиями (он разрабатывался на основе базы данных Interbase 6, исходные коды которой были открыты компанией Borland). Он включает в себя расширенную поддержку операторов SQL (например, INSERT...RETURNING), хранимых процедур, триггеров и т.д. Вы можете написать скомпилированные библиотеки UDF (библиотеки пользовательских функций) для сервера в FreePascal, если вы хотите расширить и без того обширный список функций Firebird.
66
77База данных требует очень мало ручной работы администратора баз данных после того, как она настроена, что делает ее идеальной для использования в малом бизнесе или для встроенного использования. При правильной настройке он может вырасти до терабайтного масштаба, хотя PostgreSQL может быть лучшим выбором для таких больших сред.
88
99Firebird предлагает как встроенную (основанную на файлах), так и клиент-серверную базу данных - которую можно использовать без необходимости изменять одну строку кода в FPC/Lazarus. При использовании в качестве встроенной базы данных она предлагает более богатую поддержку SQL, чем [[SQLite]], а также плавную миграцию в базу данных клиент-сервер, хотя SQLite сама по себе является вполне встроенной базой данных.
1010
1111Последняя стабильная версия, Firebird 2.5 (прим.перев.: на момент перевода статьи - это версия Firebird 3.0.4), работает в Windows (32- и 64-разрядная версия), различных версиях Linux (32- и 64-разрядная версия), Solaris (Sparc и Intel), HP-UX (PA-Risc) и macOS.
1212
1313В настоящее время сервер портируется на Android; он пока недоступен в Windows CE/Windows Mobile.
1414
1515Поддержка Firebird в SQLDB компилятора довольно хорошая, сравнимая с уровнем поддержки [[postgres|PostgreSQL]].
1616
1717## Документация
1818
1919Официальная документация включена в FPC 2.6.2+: [Документация SQLDB для IBConnection](http://www.freepascal.org/docs-html/fcl/ibconnection/index.html)
2020
2121## Установка режимов клиент/сервер и встроенного режима сервера
2222
2323Firebird может работать в режиме клиент/сервер и в режиме встроенного сервера.
2424
2525*Client/Server* означает, что у вас где-то есть физический сервер Firebird: либо на локальной машине, либо на другой машине, доступной по вашей сети. Соединения с сервером проходят через TCP/IP; при указании соединения имя хоста содержит имя или IP-адрес. Серверу Firebird для "общения" с вашими компонентами доступа необходима *fbclient.dll/fbclient.so.nnn* (*вместе с его файлами поддержки*).
2626
2727*Embedded Firebird* означает, что ваше приложение для доступа к базе данных Firebird на локальной машине загружает единственную библиотеку, которая является и сервером, и клиентской библиотекой Firebird "в одном флаконе". При указании строки соединения имя хоста всегда пусто (не указывается). Серверу Firebird для "общения" с вашими компонентами доступа необходима *fbembed.dll/fbembed.so* (*вместе с его файлами поддержки*). См. [[Firebird embedded|вики-страницу на Firebird embedded]] для более подробной информации.
2828
2929Обратите внимание, что *fbembed.dll* может использоваться как для клиент-серверного, так и для встроенного использования, поэтому установка только этой dll может быть разумной задачей.
3030
3131------------------------------------------------------------------------
3232
3333Прим.перев.: необходимо уточнить, что выше описанное справедливо для версий FB 1.5, FB 2.0, FB 2.1 и FB 2.5. Начиная с версии FB 3.0, режим используемого сервера зависит от строки подключения, а клиентская библиотека на все случаи жизни одна - все та же *fbclient.dll/libfbclient.so.3.0.n* (где n - номер билда версии FB).
3434
3535------------------------------------------------------------------------
3636
3737### Windows
3838
3939Win64: пожалуйста, см. предупреждение [[Windows Programming Tips|здесь]] о нежелательном использовании некоторых версий FPC/Lazarus Win64.
4040
4141Для Windows: (это относится ко всем драйверам базы данных SQLDB) необходимо иметь *fbclient.dll* (или *fbembed.dll*' ) и его поддержку dll, установленных в:
4242
4343- каталог проекта **и** каталог вывода исполняемого файла/каталог приложения (например, lib /что-то еще в каталоге вашего проекта)
4444- или каталог в вашем PATH (не в системном каталоге)
4545- Если вы хотите использовать системный каталог, пожалуйста, используйте официальный установщик и поставьте галочку «скопировать fbclient в системный каталог»
4646
4747Как и для всех библиотек DLL (базы данных), разрядность библиотеки DLL должна соответствовать вашему приложению: используйте 32-разрядную библиотеку для 32-разрядной скомпилированной программы и 64-разрядную библиотеку для 64-разрядной программы.
4848
4949### Unix/Linux/macOS
5050
5151В Linux/macOS/FreeBSD должна быть установлена ​​клиентская библиотека Firebird (например, вашим менеджером пакетов; установите обычный пакет и пакет -dev), или они должны быть прописаны в путях поиска библиотеки.
5252
5353FPC ищет наиболее распространенные имена библиотек (например, libfbclient.so.2.5, libgds.so и libfbembed.so.2.5; пожалуйста, проверьте ibase60.inc, если ваша версия отличается). При желании можно указать имя библиотеки. Есть 2 способа сделать это:
5454
5555- использовать компонент [[TSQLDBLibraryLoader]] из sqldblib (FPC 2.7.1). Работает для всех компонентов коннектора SQLDB.
5656- вызвать функцию
5757 ``` pascal
5858 function InitialiseIBase60(Const LibraryName : AnsiString) : integer;
5959 ```
6060
6161 с правильным именем библиотеки (для этого может потребоваться использовать модуль ibase60dyn).
6262
6363## Примеры подключения
6464
65651\. Пример для client/server:
6666
6767`Hostname: 192.168.1.1`\
6868`* База данных находится на сервере с IP-адресом 192.168.1.1.`\
6969`DatabaseName: /interdata/example.fdb  `\
7070`* Имя файла базы данных - "example.fdb" в каталоге /interdata сервера (машина с IP-адресом 192.168.1.1).`\
7171`Username: SYSDBA`\
7272`Password: masterkey`
7373
74742\. Другой пример client/server:
7575
7676`Hostname: dbhost`\
7777`* База данных находится на сервере с именем хоста dbhost`\
7878`DatabaseName: F:\Program Files\firebird\examples\employee.fdb  `\
7979`* Имя файла базы данных - "employee.fdb" в каталоге Program Files\firebird\examples на диске F: dbhost.`\
8080`Username: SYSDBA`\
8181`Password: masterkey`
8282
83833\. Пример для embedded-режима:
8484
8585`Hostname: <пустая строка>`\
8686`* Оставляя имя хоста пустым, выбирается embedded-режим.`\
8787`DatabaseName: test.fdb`\
8888`* Файл базы данных "test.fdb" находится в каталоге запускаемого приложения (убедитесь, что fbembed.dll находится в каталоге исполняемого файла приложения)`\
8989`Username: SYSDBA`\
9090`* Для встроенного сервера вы должны указать имя пользователя ...`\
9191`Password: <пустая строка> (`прим.перев.`: вообще-то, это может быть любая строка, в т.ч. и пустая)`\
9292`* ... но не важно, какой пароль вы укажете.`
9393
9494------------------------------------------------------------------------
9595
9696Прим.перев.: выше приведенные примеры подразумевают, что используется порт по умолчанию 3050. Если номер порта отличается от стандартного (например, пусть будет 3051), то для каждого из выше приведенных примеров строка подключения (например, к утилите *isql*) соответственно будет выглядеть следующим образом:
9797
9898``` bash
9999SQL>connect '192.168.1.1/3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';
100100```
101101
102102``` bash
103103SQL>connect 'dbhost/3051:F:\Program Files\firebird\examples\employee.fdb' -user 'SYSDBA' -password 'masterkey';
104104```
105105
106106``` bash
107107SQL>connect 'test.fdb' -user 'SYSDBA' -password '';
108108```
109109
110110Начиная с версии FB 3 появилась возможность указывать другие протоколы коннекта:
111111
112112- **INET**-протокол (для TCP/IP) в виде строки `<host>[/<port>]:<database file path or alias>`
113113
114114Тогда строка подключения (например, к утилите *isql*) для выше указанных примеров соответственно будет выглядеть так:
115115
116116``` bash
117117SQL>connect 'inet://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';
118118```
119119
120120``` bash
121121SQL>connect 'inet://dbhost:3051:F:\Program Files\firebird\examples\employee.fdb' -user 'SYSDBA' -password 'masterkey';
122122```
123123
124124``` bash
125125SQL>connect 'inet://test.fdb' -user 'SYSDBA' -password '';
126126```
127127
128128INET-протокол поддерживает *URL-стиль* (для адресов IPv4 и IPv6) строки подключения вы виде шаблона `[<protocol>://[<host>[:<port>]]]/<database file path or alias>`. Тогда в строке подключения часть строки заменяется с *inet://* на *inet4://* или *inet6://* соответственно. Например:
129129
130130``` bash
131131SQL>connect 'inet6://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';
132132```
133133
134134> **Note:** по умолчанию Firebird прослушивает нулевой адрес IPv6 (: :) и принимает все входящие соединения, будь то IPv4 или IPv6. Если эти адреса имеют ненулевое значение, то в строке подключения они обрамляются квадратными скобками, чтобы устранить двусмысленность при использовании двоеточия в качестве разделителя
135135
136136.
137137
138138Например, если `IPv6 = 2014:1234::5`, то строка подключения примет вид:
139139
140140``` bash
141141SQL>connect '[2014:1234::5]://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';
142142```
143143
144144и далее по аналогии...
145145
146146- протокол NetBEUI, или **WNET** (именованные каналы) - **только для Windows!** - в виде строки `\\<host>[@<port>]\<database file path or alias>`.
147147- протокол **XNET** для локальных подключений с использованием общей памяти.
148148
149149Последние два протокола имеют строку подключения, аналогичную INET, только вместо *inet://* подставляются *wnet://* или *xnet://* соответственно.
150150
151151Более подробную информацию по нововведениям FB 3, в том числе и по протоколам коннекта можно посмотреть [здесь](http://www.ibase.ru/files/firebird/Firebird_v3.0.3.ReleaseNotes.pdf).
152152
153153------------------------------------------------------------------------
154154
155155## Устранение проблем с доступом client/server
156156
157157Убедитесь, что вы запустили сервер Interbase/Firebird на указанном вами IP-адресе/имени хоста сервера. Вы можете проверить подключение, подключившись к компьютеру через telnet. Firebird обычно слушает порт 3050:
158158
159159``` bash
160160telnet 192.168.1.1 3050
161161```
162162
163163Вы должны увидеть что-то, может быть, просто пустой экран, но вы можете что-то напечатать. Это означает, что вы можете отправлять данные в базу данных Firebird.
164164
165165Для получения дополнительной информации см. документацию Firebird.
166166
167167## Мониторинг событий
168168
169169FPC/Lazarus поставляется с компонентом для мониторинга событий, поступающих из баз данных Firebird; см. [[TFBEventMonitor]].
170170
171171## Программное создание объектов
172172
173173Хотя для создания таблиц и т.д. можно использовать такие инструменты, как Flamerobin (прим.перев.: для windows, особенно русскоязычной, предпочтительнее использовать IBExpert), вы также можете создавать объекты БД программно/динамически, что может быть удобно, если вы хотите, чтобы ваши программы обновляли существующие схемы базы данных до новой схемы.
174174
175175Вы можете использовать, например, TSQLQuery.ExecSQL для выполнения этой задачи:
176176
177177``` pascal
178178Query.ExecSQL('CREATE TABLE TEST(ID INTEGER NOT NULL, TESTNAME VARCHAR(800))');
179179// Вам необходимо закомиттить транзакцию после DDL перед любыми инструкциями DML - SELECT, INSERT и т. Д.
180180//В противном случае SQL не увидит созданные объекты
181181```
182182
183183Используйте для этих целей объект TSQLScript - см. [[TSQLScript]].
184184
185185## Администрирование базы данных
186186
187187У FPC/Lazarus есть компонент для администрирования базы данных; см. [[TFBAdmin]]
188188
189189## Общие проблемы и решения
190190
191191Иногда использование Firebird в Lazarus кажется сложным. Пожалуйста, поищите решения ниже по тексту.
192192
193193### Попытка обновления доступного только для чтения столбца / полей COMPUTED BY
194194
195195Если в вашей таблице Firebird есть поля COMPUTED BY (вычисляемые поля на стороне сервера), SQLDB не будет брать в расчет, что это поля только для чтения (из соображений производительности).
196196
197197В этом случае автоматически сгенерированные операторы INSERTSQL, UPDATESQL могут привести к сообщениям об ошибках, таких как "attempted update of read-only column" (попытка обновления столбца только для чтения).Решение состоит в том, чтобы вручную указать, что данное поле не может быть обновлено после установки свойства SQL в TSQLQuery, что-то вроде:
198198
199199``` pascal
200200// Отключаем обновление этого поля или поиск измененных значений, поскольку пользователь не может изменить его
201201sqlquery1.fieldbyname('full_name').ProviderFlags:=[];
202202```
203203
204204### Bigint: потеря точности
205205
206206Если вы используете тип данных bigint (64-битное целое число со знаком) в Firebird, пожалуйста, используйте .AsLargeInt вместо .AsInteger для параметров:
207207
208208``` pascal
209209// Предполагая, что идентификатор здесь bigint
210210sqlquery1.sql.text := 'insert into ADDRESS (ID) values (:ID)';
211211// делаем так:
212212sqlquery1.params.parambyname('ID').aslargeint := <любая qword- или 64-bit integer-переменная>;
213213// Не делайте так:
214214//sqlquery1.params.parambyname('ID').asinteger := <любая qword- или 64-bit integer-переменная>;
215215...
216216```
217217
218218... в противном случае вы можете получить такие ошибки, как дубликат PK (первичного ключа) - при использовании bigint в качестве первичного ключа.
219219
220220### Логические типы данных
221221
222222Версии Firebird ниже 3.0 не поддерживают логические типы данных.
223223
224224По крайней мере, в транке FPC (2.7.1) этот тип данных можно эмулировать:
225225
226226Используйте домен, который использует тип SMALLINT (другие целочисленные типы также могут работать - пожалуйста, протестируйте и настройте текст):
227227
228228``` SQL
229229CREATE DOMAIN "BOOLEAN"
230230 AS SMALLINT
231231 CHECK (VALUE IS NULL OR VALUE IN (-1,0,1))
232232 /* -1 используется для совместимости с SQLDB FPC; 1 используется многими другими слоями доступа к данным */
233233;
234234```
235235
236236Позвольте вашему полю/столбцу использовать этот тип домена, например
237237
238238``` SQL
239239CREATE TABLE MYTABLE
240240(
241241...
242242 MYBOOLEANCOLUMN "BOOLEAN",
243243);
244244```
245245
246246- Теперь вы можете использовать .AsBoolean для присвоения значений полей и т.д.
247247
248248**To do: убедитесь, что это работает с гридами Lazarus и т. д..**
249249
250250### Проблемы INSERT INTO...RETURNING/Не открытый курсор
251251
252252Если вы попытаетесь сделать выборку SQL (например, Query.Open) в следущем SQL-запросе:
253253
254254``` SQL
255255INSERT INTO PEOPLE (NICKNAME) VALUES ('Superman') RETURNING ID
256256```
257257
258258и получаете что-то вроде этой ошибки:
259259
260260```dos
261261Database error: : Fetch :
262262 -Dynamic SQL Error
263263 -SQL error code = -504
264264 -Invalid cursor reference
265265 -Cursor is not open(error code: 335544569)
266266```
267267
268268во время работы FPC 2.6.0 (которая поставляется с Lazarus 1.0) или ниже, вы, вероятно, столкнулись с ошибкой синтаксического парсера FPC SQLDB.
269269
270270SQLDB считает, что выполняемый вами оператор является обычным оператором INSERT, который не возвращает данные. Очевидно, он должен возвращать данные. В более новом FPC для этого кода уже внесены исправления.
271271
272272Если вы используете генераторы/последовательности для своих первичных ключей (как это делают многие), в качестве обходного пути вы должны сначала получить следующий порядковый номер:
273273
274274``` SQL
275275SELECT NEXT VALUE FOR GEN_PEOPLEID FROM RDB$DATABASE /* Если имя вашего генератора GEN_PEOPLEID */
276276```
277277
278278затем используйте это, чтобы сделать обычный INSERT. см. [FAQ entry](http://www.firebirdfaq.org/faq111/%7CFirebird)
279279
280280------------------------------------------------------------------------
281281
282282Прим.перев.: вообще-то, мягко говоря, немного странный совет. Гораздо проще и безопаснее создать в БД триггер BeforeInsert примерно следующего содержания:
283283
284284``` sql
285285/* Trigger: TBL_PEOPLE_BI */
286286CREATE OR ALTER TRIGGER TBL_PEOPLE_BI FOR TBL_PEOPLE
287287ACTIVE BEFORE INSERT POSITION 0
288288AS
289289BEGIN
290290 /* генерируем новое значение поля, если вставляемое является NULL-значением */
291291 IF (NEW.ID IS NULL) THEN
292292 NEW.ID = GEN_ID(GEN_PEOPLEID,1);
293293END
294294^
295295```
296296
297297чтобы переложить заботу о генерации PK на плечи сервера, передавая с клиента NULL-значение генератора (или не передавая его вообще, что будет восприниматься сервером, как NULL).
298298
299299------------------------------------------------------------------------
300300
301301### Locate, кажется, не работает
302302
303303Источник: [Issue \##21988](https://bugs.freepascal.org/view.php?id=#21988)
304304
305305При запуске locate в CHAR-полях с UTF8 (или, возможно, других многобайтовых символов), locate может не найти вашу запись.
306306
307307Проблема в основном связана с используемой кодировкой UTF8 и тем, как Firebird сообщает о длине столбца. В случае UTF8 Firebird сообщает о максимальной длине столбца (в байтах) как 4 * «размер символа». Поэтому, если у вас есть столбец, определенный как char(8), Firebird сообщает 4*8=32.
308308
309309Значения "добиваются" пробелами справа до этой длины 32. При поиске, скажем, «57200001», совпадений нет, потому что в поле фактически хранится «57200001 ........................» (с конечными пробелами, представленными здесь точками ).
310310
311311Обходной путь: перепишите ваш select-запрос:
312312
313313``` sql
314314SELECT substring(THEFIELD from 1 for 8) AS THEFIELD ...
315315```
316316
317317или
318318
319319``` sql
320320SELECT cast(THEFIELD as varchar(8)) as THEFIELD ...
321321```
322322
323323или используйте VARCHAR-тип полей.
324324
325325> **Note:** эта проблема может возникать и для других баз данных, в зависимости от их возвращаемой длины.
326326
327327## Подробнее о транзакциях
328328
329329Источники для этой информации / дальнейшего чтения:
330330
331331- [Понимание транзакций Firebird](http://www.ibphoenix.com/resources/documents/how_to/doc_400) - очень детальная статья (англ.)
332332- [Транзакции в 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/))
333333- Руководство по Interbase 6 API (справедливо для Firebird+Interbase), стр. 63 и далее
334334- [Обзор настроек транзакций в Interbase](http://conferences.embarcadero.com/article/32280) (англ.)
335335- [Подробное объяснение параметров в Firebird](http://tech.groups.yahoo.com/group/firebird-support/message/58653) (англ.)
336336- [Обзор настроек в Firebird](http://fhasovic.blogspot.com/2005/02/transaction-isolation-levels-in.html) (англ.)
337337- [Уровни изоляции транзакции в 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'овские статьи, как и сам оригинальный сайт, увы, давно мертвы, остались лишь сохраненные статьи на сторонних ресурсах)
338338- README.set_transaction.txt в папке с документацией Firebird 2.5.
339339
340340### Уровни изоляции транзакций
341341
342342Если вы хотите, вы можете изменить уровни изоляции транзакции, добавив строку в свойстве Parameters транзакции:
343343
344344- `isc_tpb_read_committed`: вы видите все изменения, закомиченные другими транзакциями
345345- `isc_tpb_concurrency`: также называется Снапшотом (моментальным снимком): вы видите базу данных такой, какой она была при запуске транзакции. Имеет больше накладных расходов, чем isc_tpb_read_committed. Лучше, чем ANSI Serializable, потому что не имеет фантомных чтений.
346346- `isc_tpb_consistency`: также называется Table Stability: стабильное, сериализуемое представление данных, но блокирует таблицы. Вряд ли вам это понадобится.
347347
348348Пример:
349349
350350``` pascal
351351SQLTransaction1.Params.text:='isc_tpb_read_committed';
352352```
353353
354354Вы также можете добавить дополнительные параметры, которые влияют на транзакцию (взятые из исходного файла ibconnection.pp и [1](http://conferences.embarcadero.com/article/32280)):
355355
356356### Режим доступа
357357
358358Этот параметр позволяет или только чтение, или чтение/запись
359359
360360- `isc_tpb_read`: разрешение на чтение
361361- `isc_tpb_write`: разрешение на чтение+запись
362362
363363### Обработка конфликтов блокировки
364364
365365- `isc_tpb_nowait`: текущая транзакция откатывается с сообщением о конфликте, если запись все еще редактируется другой транзакцией
366366- `isc_tpb_wait`: если запись все еще редактируется другой транзакцией, текущая транзакция дожидается завершения работы той, первой транзакции. Может смягчить «долгоживущие блокировки» в условиях сильной конкуренции ([2](http://tech.groups.yahoo.com/group/firebird-support/message/58653)). См. ниже описание параметра timeout value.
367367
368368### Резервирование таблиц
369369
370370Соглашение по блокировкам таблиц в целом.
371371
372372- `isc_tpb_shared`: сначала указывается этот параметр, затем либо lock_read, либо lock_write для одной или нескольких таблиц. Разделяемый режим чтения или записи для таблиц.
373373- `isc_tpb_protected`: сначала указывается этот параметр, затем либо lock_read, либо lock_write для одной или нескольких таблиц. Блокировка на таблицы; может разрешить операции без блокировок за счет отложенных транзакций.
374374- `isc_tpb_lock_read`: задает блокировку чтения. Указывается, какая таблица блокируется, например, isc_tpb_lock_read=CUSTOMERS
375375- `isc_tpb_lock_write`: задает блокировку чтения/записи. Указывается, какая таблица блокируется, например, isc_tpb_lock_read=CUSTOMERS
376376
377377Комбинации:
378378
379379- Shared, lock_write: пишущая транзакция с уровнем изоляции concurrency или read committed может обновлять таблицу. Читать таблицу может любая транзакция (прим.перев.: только в режиме READ ONLY (read)).
380380- Shared, lock_read: читать и обновлять таблицу может любая транзакция.
381381- Protected, lock_write: Другие транзакции не могут обновлять таблицу. Читать таблицу могут только транзакции concurrency или read committed.
382382- Protected, lock_read: Другие транзакции не могут обновлять таблицу, но могут ее читать.
383383
384384### Версионность записей
385385
386386Этот параметр, по-видимому, относится только к режиму изоляции isc_tpb_read_committed для записей, изменяемых другими транзакциями:
387387
388388- `isc_tpb_no_rec_version`: читается только самая новая версия записи. Может быть полезно для операций пакетной/массовой вставки вместе с isc_tpb_read_committed.
389389- `isc_tpb_rec_version`: читается последняя подтвержденная версия записи, даже если в другой транзакции есть другие незакомиченные изменения. Больше накладных расходов, чем isc_tpb_no_rec_version.
390390
391391### Различные варианты
392392
393393Для полноты, в коде Firebird/Interbase FPC появилось еще несколько опций. Скорее всего, вы будете использовать isc_tpb_no_auto_undo только для ускорения вставки/редактирования пакетов.
394394
395395- isc_tpb_exclusive (видимо переводится как защищенный в Firebird, см. [3](http://tech.groups.yahoo.com/group/firebird-support/message/58653))
396396- isc_tpb_verb_time (Относится к отложенным ограничениям, которые могут выполняться в verb time или во время коммита. Firebird: не реализовано, всегда используйте verb time)
397397- isc_tpb_commit_time (Относится к отложенным ограничениям, которые могут выполняться в verb time или в commit time. Firebird: не реализовано, всегда используйте verb time)
398398- isc_tpb_ignore_limbo (игнорирует записи, созданные limbo-транзакциями. limbo-транзакции - это незавершенные транзакции в двухфазном коммите при работе с несколькими базами данных. Вряд ли вам понадобится эта функция)
399399- isc_tpb_autocommit (автокоммит транзакции: каждый оператор является отдельной транзакцией. Вероятно, специально для драйвера JDB JayBird.)
400400- isc_tpb_restart_requests (очевидно, ищет запросы в соединении, которые были активны в другой транзакции, прибивает их и перезапускает в новой транзакции.)
401401- isc_tpb_no_auto_undo (отключает журнал отмен на уровне транзакций, что удобно для получения максимальной пропускной способности при выполнении пакетного обновления. Не имеет эффекта при данных только для чтения.)
402402- isc_tpb_lock_timeout (укажите количество секунд ожидания для снятия блокировки, если вы используете isc_tpb_wait. Если это значение достигнуто без снятия блокировки, выдается сообщение об ошибке.)
403403
404404### Firebird и транзакции по стандарту ANSI/ISO SQL
405405
406406Транзакции Firebird не соответствуют 1 в 1 уровню транзакции стандарта ISO/ANSI. Приблизительно так:
407407
408408- ISO Read Committed=READ COMMITTED+RECORD_VERSION
409409- ISO Read Committed=READ COMMITTED+NO RECORD_VERSION
410410- ISO Repeatable Read=SNAPSHOT (также известная как CONCURRENCY)
411411- ISO Serializable=SNAPSHOT TABLE STABILITY (также известная как CONSISTENCY)
412412
413413### Общие комбинации
414414
415415По умолчанию (возможно, придется проверить) read committed.
416416
417417#### Пакетная/массовая вставка
418418
419419isc_tpb_read_committed и isc_tpb_no_rec_version могут быть хорошей комбинацией: она позволяет другим транзакциям функционировать во время выполнения пакетной вставки.
420420
421421#### Транзакции только для чтения
422422
423423Если вы хотите иметь доступ только для чтения к базе данных, вы можете сделать это, установив следующие параметры транзакции:
424424
425425- `isc_tpb_read`
426426- `isc_tpb_read_committed`
427427- `isc_tpb_rec_version`
428428- `nowait`
429429
430430Эта комбинация не будет блокировать сборку мусора, что само по себе хорошо. Источник: [4](http://tech.groups.yahoo.com/group/firebird-support/message/118748)
431431
432432> **Note:** [Firebird FAQ](http://www.firebirdfaq.org/faq164/) указывает, что вам понадобится доступ с правом записи в файл базы данных, даже если вы только читаете из него, если вы не установите флаг базы данных read-only \[только для чтения\] (например, с помощью утилиты gfix).
433433
434434## Ссылки и дополнительная информация
435435
436436В списке ниже приведены ссылки на дополнительную информацию о Firebird и связанных с ней инструментах.
437437
438438- [[Firebird embedded/ru|Использование Firebird embedded с приложениями FPC/Lazarus]]
439439
440440### Примеры Lazarus Firebird
441441
442442- Примеры исходного кода приложения Lazarus/Firebird [5](http://lazarus.freepascal.org/index.php/topic,13940.msg73617.html#msg73617)
443443- Учебники Firebird/SQLDB:
444444 - [[SQLdb Tutorial0]]
445445 - [[SQLdb Tutorial1]]
446446 - [[SQLdb Tutorial2]]
447447 - [[SQLdb Tutorial3]]
448448 - [[SQLdb Tutorial4]]
449449
450450- Учебники по PP4S; включает установку Firebird на Windows, а также
451451 - [Планирование базы данных (англ.)](http://www.pp4s.co.uk/main/tu-db-plan.html)
452452 - [Установка Firebird (англ.)](http://www.pp4s.co.uk/main/tu-db-installingfirebird01.html)
453453 - [Создание базы данных Firebird (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-create.html)
454454 - [Редактирование базы данных Firebird (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-demo1.html)
455455 - [Поиск в базе данных Firebird (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-demo2.html)
456456 - [Создание и печать отчетов (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-demo3.html)
457457 - [Создание и использование хранимых процедур (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-demo4.html)
458458
459459### Инструменты администрирования
460460
461461- [FlameRobin](http://www.flamerobin.org/) - GUI инструмент с открытым исходным кодом для управления Firebird, доступный для Linux, Windows и macOS. Настоятельно рекомендуется.
462462- [Turbobird](https://github.com/motaz/turbobird) - GUI инструмент с открытым исходным кодом для управления Firebird. Написано с помощью Lazarus с использованием TIBConnection.
463463- ibconsole : инструмент для управления Firebird и базами данных Interbase с графическим интерфейсом, доступен для Windows и Linux.
464464- Lazarus Data Desktop - входит в репозиторий Lazarus (находится в каталоге 'tools/lazdatadesktop/').
465465- [LazSQLX](http://lazsqlx.wordpress.com/)- многофункциональный инструмент управления базами данных с открытым исходным кодом. Написан на Lazarus с использованием компонентов как SQLDB, так и Zeos. Включает поддержку Firebird.
466466- tiSQLEditor - включен в каталог «Support Apps» репозитория [[tiOPF]]. Это инструмент, используемый для написания SQL с некоторой поддержкой автозавершения кода, может запускать сценарии, выполнять сценарии обновления для приложений от одной сборки до более поздней сборки, имеет различные удобные функции копирования и вставки для приложений Object Pascal, имеет много функций, которые полезны для tiOPF (создает шаблоны кода Object Pascal из результатов запросов, для классов посетителей tiOPF), экспортирует результаты запросов в CSV и т.д.
467467- Прим.перев.: [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).
468468
469469### Firebird
470470
471471- РСУБД [Firebird](http://firebirdsql.org/). Этот сайт также содержит много документации по Firebird.
472472- Firebird [FAQ](http://firebirdfaq.org/). Удобный сайт, который показывает, например, отличия от других РСУБД.
473473- [Новый сайт](http://www.controlpascal.com/firebird.htm), который показывает, как использовать новейшие инструменты и LibreOffice, FPC будет добавлен в ближайшее время.
474474
475-\
476-
477475---
478476*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).*

Back to history