Sign in Join
Wiki copytemporary

Firebird/ru: what changed

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

Title: Firebird/ru

OldNewLine
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).*

Back to history