Sign in Join
Wiki copytemporary

Firebird/ru: what changed

Revision 2 to 3. 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
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`
67+```text
68+Hostname: 192.168.1.1
69+* База данных находится на сервере с IP-адресом 192.168.1.1.
70+DatabaseName: /interdata/example.fdb
71+* Имя файла базы данных - "example.fdb" в каталоге /interdata сервера (машина с IP-адресом 192.168.1.1).
72+Username: SYSDBA
73+Password: masterkey
74+```
7375
74762\. Другой пример client/server:
7577
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`
78+``` pascal
79+Hostname: dbhost
80+* База данных находится на сервере с именем хоста dbhost
81+DatabaseName: F:\Program Files\firebird\examples\employee.fdb
82+* Имя файла базы данных - "employee.fdb" в каталоге Program Files\firebird\examples на диске F: dbhost.
83+Username: SYSDBA
84+Password: masterkey
85+```
8286
83873\. Пример для embedded-режима:
8488
85-`Hostname: <пустая строка>`\
86-`* Оставляя имя хоста пустым, выбирается embedded-режим.`\
87-`DatabaseName: test.fdb`\
88-`* Файл базы данных "test.fdb" находится в каталоге запускаемого приложения (убедитесь, что fbembed.dll находится в каталоге исполняемого файла приложения)`\
89-`Username: SYSDBA`\
90-`* Для встроенного сервера вы должны указать имя пользователя ...`\
91-`Password: <пустая строка> (`прим.перев.`: вообще-то, это может быть любая строка, в т.ч. и пустая)`\
92-`* ... но не важно, какой пароль вы укажете.`
89+```text
90+Hostname: <пустая строка>
91+* Оставляя имя хоста пустым, выбирается embedded-режим.
92+DatabaseName: test.fdb
93+* Файл базы данных "test.fdb" находится в каталоге запускаемого приложения (убедитесь, что fbembed.dll находится в каталоге исполняемого файла приложения)
94+Username: SYSDBA
95+* Для встроенного сервера вы должны указать имя пользователя ...
96+Password: <пустая строка> (прим.перев.: вообще-то, это может быть любая строка, в т.ч. и пустая)
97+* ... но не важно, какой пароль вы укажете.
98+```
9399
94100------------------------------------------------------------------------
95101
96102Прим.перев.: выше приведенные примеры подразумевают, что используется порт по умолчанию 3050. Если номер порта отличается от стандартного (например, пусть будет 3051), то для каждого из выше приведенных примеров строка подключения (например, к утилите *isql*) соответственно будет выглядеть следующим образом:
97103
98104``` bash
99105SQL>connect '192.168.1.1/3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';
100106```
101107
102108``` bash
103109SQL>connect 'dbhost/3051:F:\Program Files\firebird\examples\employee.fdb' -user 'SYSDBA' -password 'masterkey';
104110```
105111
106112``` bash
107113SQL>connect 'test.fdb' -user 'SYSDBA' -password '';
108114```
109115
110116Начиная с версии FB 3 появилась возможность указывать другие протоколы коннекта:
111117
112118- **INET**-протокол (для TCP/IP) в виде строки `<host>[/<port>]:<database file path or alias>`
113119
114120Тогда строка подключения (например, к утилите *isql*) для выше указанных примеров соответственно будет выглядеть так:
115121
116122``` bash
117123SQL>connect 'inet://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';
118124```
119125
120126``` bash
121127SQL>connect 'inet://dbhost:3051:F:\Program Files\firebird\examples\employee.fdb' -user 'SYSDBA' -password 'masterkey';
122128```
123129
124130``` bash
125131SQL>connect 'inet://test.fdb' -user 'SYSDBA' -password '';
126132```
127133
128134INET-протокол поддерживает *URL-стиль* (для адресов IPv4 и IPv6) строки подключения вы виде шаблона `[<protocol>://[<host>[:<port>]]]/<database file path or alias>`. Тогда в строке подключения часть строки заменяется с *inet://* на *inet4://* или *inet6://* соответственно. Например:
129135
130136``` bash
131137SQL>connect 'inet6://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';
132138```
133139
134140> **Note:** по умолчанию Firebird прослушивает нулевой адрес IPv6 (: :) и принимает все входящие соединения, будь то IPv4 или IPv6. Если эти адреса имеют ненулевое значение, то в строке подключения они обрамляются квадратными скобками, чтобы устранить двусмысленность при использовании двоеточия в качестве разделителя
135141
136142.
137143
138144Например, если `IPv6 = 2014:1234::5`, то строка подключения примет вид:
139145
140146``` bash
141147SQL>connect '[2014:1234::5]://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';
142148```
143149
144150и далее по аналогии...
145151
146152- протокол NetBEUI, или **WNET** (именованные каналы) - **только для Windows!** - в виде строки `\\<host>[@<port>]\<database file path or alias>`.
147153- протокол **XNET** для локальных подключений с использованием общей памяти.
148154
149155Последние два протокола имеют строку подключения, аналогичную INET, только вместо *inet://* подставляются *wnet://* или *xnet://* соответственно.
150156
151157Более подробную информацию по нововведениям FB 3, в том числе и по протоколам коннекта можно посмотреть [здесь](http://www.ibase.ru/files/firebird/Firebird_v3.0.3.ReleaseNotes.pdf).
152158
153159------------------------------------------------------------------------
154160
155161## Устранение проблем с доступом client/server
156162
157163Убедитесь, что вы запустили сервер Interbase/Firebird на указанном вами IP-адресе/имени хоста сервера. Вы можете проверить подключение, подключившись к компьютеру через telnet. Firebird обычно слушает порт 3050:
158164
159165``` bash
160166telnet 192.168.1.1 3050
161167```
162168
163169Вы должны увидеть что-то, может быть, просто пустой экран, но вы можете что-то напечатать. Это означает, что вы можете отправлять данные в базу данных Firebird.
164170
165171Для получения дополнительной информации см. документацию Firebird.
166172
167173## Мониторинг событий
168174
169175FPC/Lazarus поставляется с компонентом для мониторинга событий, поступающих из баз данных Firebird; см. [[TFBEventMonitor]].
170176
171177## Программное создание объектов
172178
173179Хотя для создания таблиц и т.д. можно использовать такие инструменты, как Flamerobin (прим.перев.: для windows, особенно русскоязычной, предпочтительнее использовать IBExpert), вы также можете создавать объекты БД программно/динамически, что может быть удобно, если вы хотите, чтобы ваши программы обновляли существующие схемы базы данных до новой схемы.
174180
175181Вы можете использовать, например, TSQLQuery.ExecSQL для выполнения этой задачи:
176182
177183``` pascal
178184Query.ExecSQL('CREATE TABLE TEST(ID INTEGER NOT NULL, TESTNAME VARCHAR(800))');
179185// Вам необходимо закомиттить транзакцию после DDL перед любыми инструкциями DML - SELECT, INSERT и т. Д.
180186//В противном случае SQL не увидит созданные объекты
181187```
182188
183189Используйте для этих целей объект TSQLScript - см. [[TSQLScript]].
184190
185191## Администрирование базы данных
186192
187193У FPC/Lazarus есть компонент для администрирования базы данных; см. [[TFBAdmin]]
188194
189195## Общие проблемы и решения
190196
191197Иногда использование Firebird в Lazarus кажется сложным. Пожалуйста, поищите решения ниже по тексту.
192198
193199### Попытка обновления доступного только для чтения столбца / полей COMPUTED BY
194200
195201Если в вашей таблице Firebird есть поля COMPUTED BY (вычисляемые поля на стороне сервера), SQLDB не будет брать в расчет, что это поля только для чтения (из соображений производительности).
196202
197203В этом случае автоматически сгенерированные операторы INSERTSQL, UPDATESQL могут привести к сообщениям об ошибках, таких как "attempted update of read-only column" (попытка обновления столбца только для чтения).Решение состоит в том, чтобы вручную указать, что данное поле не может быть обновлено после установки свойства SQL в TSQLQuery, что-то вроде:
198204
199205``` pascal
200206// Отключаем обновление этого поля или поиск измененных значений, поскольку пользователь не может изменить его
201207sqlquery1.fieldbyname('full_name').ProviderFlags:=[];
202208```
203209
204210### Bigint: потеря точности
205211
206212Если вы используете тип данных bigint (64-битное целое число со знаком) в Firebird, пожалуйста, используйте .AsLargeInt вместо .AsInteger для параметров:
207213
208214``` pascal
209215// Предполагая, что идентификатор здесь bigint
210216sqlquery1.sql.text := 'insert into ADDRESS (ID) values (:ID)';
211217// делаем так:
212218sqlquery1.params.parambyname('ID').aslargeint := <любая qword- или 64-bit integer-переменная>;
213219// Не делайте так:
214220//sqlquery1.params.parambyname('ID').asinteger := <любая qword- или 64-bit integer-переменная>;
215221...
216222```
217223
218224... в противном случае вы можете получить такие ошибки, как дубликат PK (первичного ключа) - при использовании bigint в качестве первичного ключа.
219225
220226### Логические типы данных
221227
222228Версии Firebird ниже 3.0 не поддерживают логические типы данных.
223229
224230По крайней мере, в транке FPC (2.7.1) этот тип данных можно эмулировать:
225231
226232Используйте домен, который использует тип SMALLINT (другие целочисленные типы также могут работать - пожалуйста, протестируйте и настройте текст):
227233
228234``` SQL
229235CREATE DOMAIN "BOOLEAN"
230236 AS SMALLINT
231237 CHECK (VALUE IS NULL OR VALUE IN (-1,0,1))
232238 /* -1 используется для совместимости с SQLDB FPC; 1 используется многими другими слоями доступа к данным */
233239;
234240```
235241
236242Позвольте вашему полю/столбцу использовать этот тип домена, например
237243
238244``` SQL
239245CREATE TABLE MYTABLE
240246(
241247...
242248 MYBOOLEANCOLUMN "BOOLEAN",
243249);
244250```
245251
246252- Теперь вы можете использовать .AsBoolean для присвоения значений полей и т.д.
247253
248254**To do: убедитесь, что это работает с гридами Lazarus и т. д..**
249255
250256### Проблемы INSERT INTO...RETURNING/Не открытый курсор
251257
252258Если вы попытаетесь сделать выборку SQL (например, Query.Open) в следущем SQL-запросе:
253259
254260``` SQL
255261INSERT INTO PEOPLE (NICKNAME) VALUES ('Superman') RETURNING ID
256262```
257263
258264и получаете что-то вроде этой ошибки:
259265
260266```dos
261267Database error: : Fetch :
262268 -Dynamic SQL Error
263269 -SQL error code = -504
264270 -Invalid cursor reference
265271 -Cursor is not open(error code: 335544569)
266272```
267273
268274во время работы FPC 2.6.0 (которая поставляется с Lazarus 1.0) или ниже, вы, вероятно, столкнулись с ошибкой синтаксического парсера FPC SQLDB.
269275
270276SQLDB считает, что выполняемый вами оператор является обычным оператором INSERT, который не возвращает данные. Очевидно, он должен возвращать данные. В более новом FPC для этого кода уже внесены исправления.
271277
272278Если вы используете генераторы/последовательности для своих первичных ключей (как это делают многие), в качестве обходного пути вы должны сначала получить следующий порядковый номер:
273279
274280``` SQL
275281SELECT NEXT VALUE FOR GEN_PEOPLEID FROM RDB$DATABASE /* Если имя вашего генератора GEN_PEOPLEID */
276282```
277283
278284затем используйте это, чтобы сделать обычный INSERT. см. [FAQ entry](http://www.firebirdfaq.org/faq111/%7CFirebird)
279285
280286------------------------------------------------------------------------
281287
282288Прим.перев.: вообще-то, мягко говоря, немного странный совет. Гораздо проще и безопаснее создать в БД триггер BeforeInsert примерно следующего содержания:
283289
284290``` sql
285291/* Trigger: TBL_PEOPLE_BI */
286292CREATE OR ALTER TRIGGER TBL_PEOPLE_BI FOR TBL_PEOPLE
287293ACTIVE BEFORE INSERT POSITION 0
288294AS
289295BEGIN
290296 /* генерируем новое значение поля, если вставляемое является NULL-значением */
291297 IF (NEW.ID IS NULL) THEN
292298 NEW.ID = GEN_ID(GEN_PEOPLEID,1);
293299END
294300^
295301```
296302
297303чтобы переложить заботу о генерации PK на плечи сервера, передавая с клиента NULL-значение генератора (или не передавая его вообще, что будет восприниматься сервером, как NULL).
298304
299305------------------------------------------------------------------------
300306
301307### Locate, кажется, не работает
302308
303309Источник: [Issue \##21988](https://bugs.freepascal.org/view.php?id=#21988)
304310
305311При запуске locate в CHAR-полях с UTF8 (или, возможно, других многобайтовых символов), locate может не найти вашу запись.
306312
307313Проблема в основном связана с используемой кодировкой UTF8 и тем, как Firebird сообщает о длине столбца. В случае UTF8 Firebird сообщает о максимальной длине столбца (в байтах) как 4 * «размер символа». Поэтому, если у вас есть столбец, определенный как char(8), Firebird сообщает 4*8=32.
308314
309315Значения "добиваются" пробелами справа до этой длины 32. При поиске, скажем, «57200001», совпадений нет, потому что в поле фактически хранится «57200001 ........................» (с конечными пробелами, представленными здесь точками ).
310316
311317Обходной путь: перепишите ваш select-запрос:
312318
313319``` sql
314320SELECT substring(THEFIELD from 1 for 8) AS THEFIELD ...
315321```
316322
317323или
318324
319325``` sql
320326SELECT cast(THEFIELD as varchar(8)) as THEFIELD ...
321327```
322328
323329или используйте VARCHAR-тип полей.
324330
325331> **Note:** эта проблема может возникать и для других баз данных, в зависимости от их возвращаемой длины.
326332
327333## Подробнее о транзакциях
328334
329335Источники для этой информации / дальнейшего чтения:
330336
331337- [Понимание транзакций Firebird](http://www.ibphoenix.com/resources/documents/how_to/doc_400) - очень детальная статья (англ.)
332338- [Транзакции в 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/))
333339- Руководство по Interbase 6 API (справедливо для Firebird+Interbase), стр. 63 и далее
334340- [Обзор настроек транзакций в Interbase](http://conferences.embarcadero.com/article/32280) (англ.)
335341- [Подробное объяснение параметров в Firebird](http://tech.groups.yahoo.com/group/firebird-support/message/58653) (англ.)
336342- [Обзор настроек в Firebird](http://fhasovic.blogspot.com/2005/02/transaction-isolation-levels-in.html) (англ.)
337343- [Уровни изоляции транзакции в 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'овские статьи, как и сам оригинальный сайт, увы, давно мертвы, остались лишь сохраненные статьи на сторонних ресурсах)
338344- README.set_transaction.txt в папке с документацией Firebird 2.5.
339345
340346### Уровни изоляции транзакций
341347
342348Если вы хотите, вы можете изменить уровни изоляции транзакции, добавив строку в свойстве Parameters транзакции:
343349
344350- `isc_tpb_read_committed`: вы видите все изменения, закомиченные другими транзакциями
345351- `isc_tpb_concurrency`: также называется Снапшотом (моментальным снимком): вы видите базу данных такой, какой она была при запуске транзакции. Имеет больше накладных расходов, чем isc_tpb_read_committed. Лучше, чем ANSI Serializable, потому что не имеет фантомных чтений.
346352- `isc_tpb_consistency`: также называется Table Stability: стабильное, сериализуемое представление данных, но блокирует таблицы. Вряд ли вам это понадобится.
347353
348354Пример:
349355
350356``` pascal
351357SQLTransaction1.Params.text:='isc_tpb_read_committed';
352358```
353359
354360Вы также можете добавить дополнительные параметры, которые влияют на транзакцию (взятые из исходного файла ibconnection.pp и [1](http://conferences.embarcadero.com/article/32280)):
355361
356362### Режим доступа
357363
358364Этот параметр позволяет или только чтение, или чтение/запись
359365
360366- `isc_tpb_read`: разрешение на чтение
361367- `isc_tpb_write`: разрешение на чтение+запись
362368
363369### Обработка конфликтов блокировки
364370
365371- `isc_tpb_nowait`: текущая транзакция откатывается с сообщением о конфликте, если запись все еще редактируется другой транзакцией
366372- `isc_tpb_wait`: если запись все еще редактируется другой транзакцией, текущая транзакция дожидается завершения работы той, первой транзакции. Может смягчить «долгоживущие блокировки» в условиях сильной конкуренции ([2](http://tech.groups.yahoo.com/group/firebird-support/message/58653)). См. ниже описание параметра timeout value.
367373
368374### Резервирование таблиц
369375
370376Соглашение по блокировкам таблиц в целом.
371377
372378- `isc_tpb_shared`: сначала указывается этот параметр, затем либо lock_read, либо lock_write для одной или нескольких таблиц. Разделяемый режим чтения или записи для таблиц.
373379- `isc_tpb_protected`: сначала указывается этот параметр, затем либо lock_read, либо lock_write для одной или нескольких таблиц. Блокировка на таблицы; может разрешить операции без блокировок за счет отложенных транзакций.
374380- `isc_tpb_lock_read`: задает блокировку чтения. Указывается, какая таблица блокируется, например, isc_tpb_lock_read=CUSTOMERS
375381- `isc_tpb_lock_write`: задает блокировку чтения/записи. Указывается, какая таблица блокируется, например, isc_tpb_lock_read=CUSTOMERS
376382
377383Комбинации:
378384
379385- Shared, lock_write: пишущая транзакция с уровнем изоляции concurrency или read committed может обновлять таблицу. Читать таблицу может любая транзакция (прим.перев.: только в режиме READ ONLY (read)).
380386- Shared, lock_read: читать и обновлять таблицу может любая транзакция.
381387- Protected, lock_write: Другие транзакции не могут обновлять таблицу. Читать таблицу могут только транзакции concurrency или read committed.
382388- Protected, lock_read: Другие транзакции не могут обновлять таблицу, но могут ее читать.
383389
384390### Версионность записей
385391
386392Этот параметр, по-видимому, относится только к режиму изоляции isc_tpb_read_committed для записей, изменяемых другими транзакциями:
387393
388394- `isc_tpb_no_rec_version`: читается только самая новая версия записи. Может быть полезно для операций пакетной/массовой вставки вместе с isc_tpb_read_committed.
389395- `isc_tpb_rec_version`: читается последняя подтвержденная версия записи, даже если в другой транзакции есть другие незакомиченные изменения. Больше накладных расходов, чем isc_tpb_no_rec_version.
390396
391397### Различные варианты
392398
393399Для полноты, в коде Firebird/Interbase FPC появилось еще несколько опций. Скорее всего, вы будете использовать isc_tpb_no_auto_undo только для ускорения вставки/редактирования пакетов.
394400
395401- isc_tpb_exclusive (видимо переводится как защищенный в Firebird, см. [3](http://tech.groups.yahoo.com/group/firebird-support/message/58653))
396402- isc_tpb_verb_time (Относится к отложенным ограничениям, которые могут выполняться в verb time или во время коммита. Firebird: не реализовано, всегда используйте verb time)
397403- isc_tpb_commit_time (Относится к отложенным ограничениям, которые могут выполняться в verb time или в commit time. Firebird: не реализовано, всегда используйте verb time)
398404- isc_tpb_ignore_limbo (игнорирует записи, созданные limbo-транзакциями. limbo-транзакции - это незавершенные транзакции в двухфазном коммите при работе с несколькими базами данных. Вряд ли вам понадобится эта функция)
399405- isc_tpb_autocommit (автокоммит транзакции: каждый оператор является отдельной транзакцией. Вероятно, специально для драйвера JDB JayBird.)
400406- isc_tpb_restart_requests (очевидно, ищет запросы в соединении, которые были активны в другой транзакции, прибивает их и перезапускает в новой транзакции.)
401407- isc_tpb_no_auto_undo (отключает журнал отмен на уровне транзакций, что удобно для получения максимальной пропускной способности при выполнении пакетного обновления. Не имеет эффекта при данных только для чтения.)
402408- isc_tpb_lock_timeout (укажите количество секунд ожидания для снятия блокировки, если вы используете isc_tpb_wait. Если это значение достигнуто без снятия блокировки, выдается сообщение об ошибке.)
403409
404410### Firebird и транзакции по стандарту ANSI/ISO SQL
405411
406412Транзакции Firebird не соответствуют 1 в 1 уровню транзакции стандарта ISO/ANSI. Приблизительно так:
407413
408414- ISO Read Committed=READ COMMITTED+RECORD_VERSION
409415- ISO Read Committed=READ COMMITTED+NO RECORD_VERSION
410416- ISO Repeatable Read=SNAPSHOT (также известная как CONCURRENCY)
411417- ISO Serializable=SNAPSHOT TABLE STABILITY (также известная как CONSISTENCY)
412418
413419### Общие комбинации
414420
415421По умолчанию (возможно, придется проверить) read committed.
416422
417423#### Пакетная/массовая вставка
418424
419425isc_tpb_read_committed и isc_tpb_no_rec_version могут быть хорошей комбинацией: она позволяет другим транзакциям функционировать во время выполнения пакетной вставки.
420426
421427#### Транзакции только для чтения
422428
423429Если вы хотите иметь доступ только для чтения к базе данных, вы можете сделать это, установив следующие параметры транзакции:
424430
425431- `isc_tpb_read`
426432- `isc_tpb_read_committed`
427433- `isc_tpb_rec_version`
428434- `nowait`
429435
430436Эта комбинация не будет блокировать сборку мусора, что само по себе хорошо. Источник: [4](http://tech.groups.yahoo.com/group/firebird-support/message/118748)
431437
432438> **Note:** [Firebird FAQ](http://www.firebirdfaq.org/faq164/) указывает, что вам понадобится доступ с правом записи в файл базы данных, даже если вы только читаете из него, если вы не установите флаг базы данных read-only \[только для чтения\] (например, с помощью утилиты gfix).
433439
434440## Ссылки и дополнительная информация
435441
436442В списке ниже приведены ссылки на дополнительную информацию о Firebird и связанных с ней инструментах.
437443
438444- [[Firebird embedded/ru|Использование Firebird embedded с приложениями FPC/Lazarus]]
439445
440446### Примеры Lazarus Firebird
441447
442448- Примеры исходного кода приложения Lazarus/Firebird [5](http://lazarus.freepascal.org/index.php/topic,13940.msg73617.html#msg73617)
443449- Учебники Firebird/SQLDB:
444450 - [[SQLdb Tutorial0]]
445451 - [[SQLdb Tutorial1]]
446452 - [[SQLdb Tutorial2]]
447453 - [[SQLdb Tutorial3]]
448454 - [[SQLdb Tutorial4]]
449455
450456- Учебники по PP4S; включает установку Firebird на Windows, а также
451457 - [Планирование базы данных (англ.)](http://www.pp4s.co.uk/main/tu-db-plan.html)
452458 - [Установка Firebird (англ.)](http://www.pp4s.co.uk/main/tu-db-installingfirebird01.html)
453459 - [Создание базы данных Firebird (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-create.html)
454460 - [Редактирование базы данных Firebird (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-demo1.html)
455461 - [Поиск в базе данных Firebird (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-demo2.html)
456462 - [Создание и печать отчетов (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-demo3.html)
457463 - [Создание и использование хранимых процедур (англ.)](http://www.pp4s.co.uk/main/tu-db-firebird-demo4.html)
458464
459465### Инструменты администрирования
460466
461467- [FlameRobin](http://www.flamerobin.org/) - GUI инструмент с открытым исходным кодом для управления Firebird, доступный для Linux, Windows и macOS. Настоятельно рекомендуется.
462468- [Turbobird](https://github.com/motaz/turbobird) - GUI инструмент с открытым исходным кодом для управления Firebird. Написано с помощью Lazarus с использованием TIBConnection.
463469- ibconsole : инструмент для управления Firebird и базами данных Interbase с графическим интерфейсом, доступен для Windows и Linux.
464470- Lazarus Data Desktop - входит в репозиторий Lazarus (находится в каталоге 'tools/lazdatadesktop/').
465471- [LazSQLX](http://lazsqlx.wordpress.com/)- многофункциональный инструмент управления базами данных с открытым исходным кодом. Написан на Lazarus с использованием компонентов как SQLDB, так и Zeos. Включает поддержку Firebird.
466472- tiSQLEditor - включен в каталог «Support Apps» репозитория [[tiOPF]]. Это инструмент, используемый для написания SQL с некоторой поддержкой автозавершения кода, может запускать сценарии, выполнять сценарии обновления для приложений от одной сборки до более поздней сборки, имеет различные удобные функции копирования и вставки для приложений Object Pascal, имеет много функций, которые полезны для tiOPF (создает шаблоны кода Object Pascal из результатов запросов, для классов посетителей tiOPF), экспортирует результаты запросов в CSV и т.д.
467473- Прим.перев.: [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).
468474
469475### Firebird
470476
471477- РСУБД [Firebird](http://firebirdsql.org/). Этот сайт также содержит много документации по Firebird.
472478- Firebird [FAQ](http://firebirdfaq.org/). Удобный сайт, который показывает, например, отличия от других РСУБД.
473479- [Новый сайт](http://www.controlpascal.com/firebird.htm), который показывает, как использовать новейшие инструменты и LibreOffice, FPC будет добавлен в ближайшее время.
474480
475481---
476482*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