Difference between revisions of "Firebird/ru"

From Free Pascal wiki
Jump to navigationJump to search
m (OSX -> macOS)
 
(35 intermediate revisions by one other user not shown)
Line 13: Line 13:
 
Firebird предлагает как встроенную (основанную на файлах), так и клиент-серверную базу данных - которую можно использовать без необходимости изменять одну строку кода в FPC/Lazarus. При использовании в качестве встроенной базы данных она предлагает более богатую поддержку SQL, чем [[SQLite]], а также плавную миграцию в базу данных клиент-сервер, хотя SQLite сама по себе является вполне встроенной базой данных.
 
Firebird предлагает как встроенную (основанную на файлах), так и клиент-серверную базу данных - которую можно использовать без необходимости изменять одну строку кода в FPC/Lazarus. При использовании в качестве встроенной базы данных она предлагает более богатую поддержку SQL, чем [[SQLite]], а также плавную миграцию в базу данных клиент-сервер, хотя SQLite сама по себе является вполне встроенной базой данных.
  
Последняя стабильная версия, Firebird 2.5 ([[User:Zoltanleo|прим.перев.]]: на момент перевода статьи - это версия Firebird 3.0.4), работает в Windows (32- и 64-разрядная версия), различных версиях Linux (32- и 64-разрядная версия), Solaris (Sparc и Intel), HP-UX (PA-Risc) и OSX.
+
Последняя стабильная версия, Firebird 2.5 ([[User:Zoltanleo|прим.перев.]]: на момент перевода статьи - это версия Firebird 3.0.4), работает в Windows (32- и 64-разрядная версия), различных версиях Linux (32- и 64-разрядная версия), Solaris (Sparc и Intel), HP-UX (PA-Risc) и macOS.
  
 
В настоящее время сервер портируется на Android; он пока недоступен в Windows CE/Windows Mobile.
 
В настоящее время сервер портируется на Android; он пока недоступен в Windows CE/Windows Mobile.
Line 33: Line 33:
  
 
----
 
----
[[User:Zoltanleo|Прим.перев.]]: необходимо уточнить, что выше описанное справедливо для версий FB 1.5, FB 2.0, FB 2.1 и FB 2.5. Начиная с версии FB 3.0 режим используемого сервера зависит от строки подключения, а клиентская библиотека на все случаи жизни одна - все та же ''fbclient.dll/libfbclient.so.3.0.n'' (где n - номер билда версии FB).  
+
[[User:Zoltanleo|Прим.перев.]]: необходимо уточнить, что выше описанное справедливо для версий FB 1.5, FB 2.0, FB 2.1 и FB 2.5. Начиная с версии FB 3.0, режим используемого сервера зависит от строки подключения, а клиентская библиотека на все случаи жизни одна - все та же ''fbclient.dll/libfbclient.so.3.0.n'' (где n - номер билда версии FB).  
 
----
 
----
  
Line 46: Line 46:
 
Как и для всех библиотек DLL (базы данных), разрядность библиотеки DLL должна соответствовать вашему приложению: используйте 32-разрядную библиотеку для 32-разрядной скомпилированной программы и 64-разрядную библиотеку для 64-разрядной программы.
 
Как и для всех библиотек DLL (базы данных), разрядность библиотеки DLL должна соответствовать вашему приложению: используйте 32-разрядную библиотеку для 32-разрядной скомпилированной программы и 64-разрядную библиотеку для 64-разрядной программы.
  
===Unix/Linux/OSX===
+
===Unix/Linux/macOS===
В Linux/OSX/FreeBSD должна быть установлена ​​клиентская библиотека Firebird (например, вашим менеджером пакетов; установите обычный пакет и пакет -dev), или они должны быть прописаны в путях поиска библиотеки.
+
В Linux/macOS/FreeBSD должна быть установлена ​​клиентская библиотека Firebird (например, вашим менеджером пакетов; установите обычный пакет и пакет -dev), или они должны быть прописаны в путях поиска библиотеки.
  
 
FPC ищет наиболее распространенные имена библиотек (например, libfbclient.so.2.5, libgds.so и libfbembed.so.2.5; пожалуйста, проверьте ibase60.inc, если ваша версия отличается). При желании можно указать имя библиотеки. Есть 2 способа сделать это:
 
FPC ищет наиболее распространенные имена библиотек (например, libfbclient.so.2.5, libgds.so и libfbembed.so.2.5; пожалуйста, проверьте ibase60.inc, если ваша версия отличается). При желании можно указать имя библиотеки. Есть 2 способа сделать это:
Line 53: Line 53:
 
* вызвать функцию <syntaxhighlight lang=pascal>function InitialiseIBase60(Const LibraryName : AnsiString) : integer;</syntaxhighlight> с правильным именем библиотеки (для этого может потребоваться использовать модуль ibase60dyn).
 
* вызвать функцию <syntaxhighlight lang=pascal>function InitialiseIBase60(Const LibraryName : AnsiString) : integer;</syntaxhighlight> с правильным именем библиотеки (для этого может потребоваться использовать модуль ibase60dyn).
  
== Connection examples ==
+
== Примеры подключения ==
Example for client/server:
+
 
 +
1. Пример для client/server:
 
  Hostname: 192.168.1.1
 
  Hostname: 192.168.1.1
  * The database is on the server with IP address 192.168.1.1.  
+
  * База данных находится на сервере с IP-адресом 192.168.1.1.
 
  DatabaseName: /interdata/example.fdb   
 
  DatabaseName: /interdata/example.fdb   
  * The name of the database file is "example.fdb" in the /interdata directory of the server (the machine with IP address 192.168.1.1).
+
  * Имя файла базы данных - "example.fdb" в каталоге /interdata сервера (машина с IP-адресом 192.168.1.1).
 
  Username: SYSDBA
 
  Username: SYSDBA
 
  Password: masterkey
 
  Password: masterkey
  
Another example for client/server:
+
2. Другой пример client/server:
 
  Hostname: dbhost
 
  Hostname: dbhost
  * The database is on the server with the host name dbhost
+
  * База данных находится на сервере с именем хоста dbhost
 
  DatabaseName: F:\Program Files\firebird\examples\employee.fdb   
 
  DatabaseName: F:\Program Files\firebird\examples\employee.fdb   
  * The name of the database file is "employee.fdb" in the Program Files\firebird\examples directory on the F: drive of dbhost.
+
  * Имя файла базы данных - "employee.fdb" в каталоге Program Files\firebird\examples на диске F: dbhost.
 
  Username: SYSDBA
 
  Username: SYSDBA
 
  Password: masterkey
 
  Password: masterkey
  
An embedded example:
+
3. Пример для embedded-режима:
  Hostname: <empty string>
+
  Hostname: <пустая строка>
  * Leaving the hostname empty selects embedded use.
+
  * Оставляя имя хоста пустым, выбирается embedded-режим.
 
  DatabaseName: test.fdb
 
  DatabaseName: test.fdb
  * The database file is "test.fdb" in the directory where the application runs (make sure fbembed.dll is in the application executable directory)
+
  * Файл базы данных "test.fdb" находится в каталоге запускаемого приложения (убедитесь, что fbembed.dll находится в каталоге исполняемого файла приложения)
 
  Username: SYSDBA
 
  Username: SYSDBA
  * On embedded, you do have to specify a username...
+
  * Для встроенного сервера вы должны указать имя пользователя ...
  Password: <empty string>
+
  Password: <пустая строка> ([[user:Zoltanleo|прим.перев.]]: вообще-то, это может быть любая строка, в т.ч. и пустая)
  * ... but it doesn't matter what password you give.
+
  * ... но не важно, какой пароль вы укажете.
 +
 
 +
----
 +
[[user:Zoltanleo|Прим.перев.]]: выше приведенные примеры подразумевают, что используется порт по умолчанию 3050. Если номер порта отличается от стандартного (например, пусть будет 3051), то для каждого из выше приведенных примеров строка подключения (например, к утилите ''isql'') соответственно будет выглядеть следующим образом:
 +
<syntaxhighlight lang=bash>SQL>connect '192.168.1.1/3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';</syntaxhighlight>
 +
<syntaxhighlight lang=bash>SQL>connect 'dbhost/3051:F:\Program Files\firebird\examples\employee.fdb' -user 'SYSDBA' -password 'masterkey';</syntaxhighlight>
 +
<syntaxhighlight lang=bash>SQL>connect 'test.fdb' -user 'SYSDBA' -password '';</syntaxhighlight>
 +
 
  
== Troubleshooting client/server access issues ==
+
Начиная с версии FB 3 появилась возможность указывать другие протоколы коннекта:
Make sure you started the Interbase/Firebird server on the server IP/hostname you specified. You can test connectivity by telnetting to the machine. Firebird usually listens on port 3050:
+
 
 +
* '''INET'''-протокол (для TCP/IP) в виде строки <code><host>[/<port>]:<database file path or alias></code>
 +
Тогда строка подключения (например, к утилите ''isql'') для выше указанных примеров соответственно будет выглядеть так:
 +
<syntaxhighlight lang=bash>SQL>connect 'inet://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';</syntaxhighlight>
 +
<syntaxhighlight lang=bash>SQL>connect 'inet://dbhost:3051:F:\Program Files\firebird\examples\employee.fdb' -user 'SYSDBA' -password 'masterkey';</syntaxhighlight>
 +
<syntaxhighlight lang=bash>SQL>connect 'inet://test.fdb' -user 'SYSDBA' -password '';</syntaxhighlight>
 +
 
 +
INET-протокол поддерживает ''URL-стиль'' (для адресов IPv4 и IPv6) строки подключения вы виде шаблона <code>[<protocol>://[<host>[:<port>]]]/<database file path or alias></code>. Тогда в строке подключения часть строки заменяется с ''inet://'' на ''inet4://'' или ''inet6://'' соответственно. Например:
 +
<syntaxhighlight lang=bash>SQL>connect 'inet6://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';</syntaxhighlight>
 +
 
 +
{{Note| по умолчанию Firebird прослушивает нулевой адрес IPv6 (: :) и принимает все входящие соединения, будь то IPv4 или IPv6. Если эти адреса имеют ненулевое значение, то в строке подключения они обрамляются квадратными скобками, чтобы устранить двусмысленность при использовании двоеточия в качестве разделителя}}.
 +
 
 +
Например, если <code>IPv6 = 2014:1234::5</code>, то строка подключения примет вид:
 +
<syntaxhighlight lang=bash>SQL>connect '[2014:1234::5]://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';</syntaxhighlight>
 +
и далее по аналогии...
 +
 
 +
* протокол NetBEUI, или '''WNET''' (именованные каналы) - '''только для Windows!''' - в виде строки <code>\\<host>[@<port>]\<database file path or alias></code>.
 +
* протокол '''XNET''' для локальных подключений с использованием общей памяти.
 +
 
 +
Последние два протокола имеют строку подключения, аналогичную INET, только вместо ''inet://'' подставляются ''wnet://'' или ''xnet://'' соответственно.
 +
 
 +
Более подробную информацию по нововведениям FB 3, в том числе и по протоколам коннекта можно посмотреть [http://www.ibase.ru/files/firebird/Firebird_v3.0.3.ReleaseNotes.pdf здесь].
 +
----
 +
 
 +
== Устранение проблем с доступом client/server ==
 +
Убедитесь, что вы запустили сервер Interbase/Firebird на указанном вами IP-адресе/имени хоста сервера. Вы можете проверить подключение, подключившись к компьютеру через telnet. Firebird обычно слушает порт 3050:
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
telnet 192.168.1.1 3050
 
telnet 192.168.1.1 3050
 
</syntaxhighlight>
 
</syntaxhighlight>
You should see something, maybe just a blank screen, but you can type something. This means you can send data to the Firebird database.
+
Вы должны увидеть что-то, может быть, просто пустой экран, но вы можете что-то напечатать. Это означает, что вы можете отправлять данные в базу данных Firebird.  
  
For further information, please see the Firebird documentation.
+
Для получения дополнительной информации см. документацию Firebird.
  
== Monitoring Events ==
+
== Мониторинг событий ==
FPC/Lazarus comes with a component to monitor events coming from Firebird databases; see [[TFBEventMonitor]].
 
== Creating objects programmatically ==
 
While you can use tools such as Flamerobin to create tables etc, you can also create these programmatically/dynamically, which could be handy when you want your programs to update existing database schemas to a new schema.
 
  
You can use e.g. TSQLQuery.ExecSQL to perform this task:
+
FPC/Lazarus поставляется с компонентом для мониторинга событий, поступающих из баз данных Firebird; см. [[TFBEventMonitor]].
<syntaxhighlight>
+
 
 +
== Программное создание объектов ==
 +
Хотя для создания таблиц и т.д. можно использовать такие инструменты, как Flamerobin ([[user:Zoltanleo|прим.перев.]]: для windows, особенно русскоязычной,  предпочтительнее использовать IBExpert), вы также можете создавать объекты БД программно/динамически, что может быть удобно, если вы хотите, чтобы ваши программы обновляли существующие схемы базы данных до новой схемы.
 +
 
 +
Вы можете использовать, например, TSQLQuery.ExecSQL для выполнения этой задачи:
 +
<syntaxhighlight lang=pascal>
 
Query.ExecSQL('CREATE TABLE TEST(ID INTEGER NOT NULL, TESTNAME VARCHAR(800))');
 
Query.ExecSQL('CREATE TABLE TEST(ID INTEGER NOT NULL, TESTNAME VARCHAR(800))');
// You need to commit the transaction after DDL before any DML - SELECT, INSERT etc statements.
+
// Вам необходимо закомиттить транзакцию после DDL перед любыми инструкциями DML - SELECT, INSERT и т. Д.
// Otherwise the SQL won't see the created objects
+
//В противном случае SQL не увидит созданные объекты
 
</syntaxhighlight>
 
</syntaxhighlight>
  
To do this, use the TSQLScript object - see [[TSQLScript]].
+
Используйте для этих целей объект TSQLScript - см. [[TSQLScript]].
  
== Database Administration ==
+
== Администрирование базы данных ==
FPC/Lazarus has a component for database adminstration; see [[TFBAdmin]]
+
У FPC/Lazarus есть компонент для администрирования базы данных; см. [[TFBAdmin]]
  
== Common problems and solutions ==
+
== Общие проблемы и решения ==
Sometimes using Firebird in Lazarus seems to be tricky. Please find solutions below.
+
Иногда использование Firebird в Lazarus кажется сложным. Пожалуйста, поищите решения ниже по тексту.
  
=== Attempted update of read-only column / COMPUTED BY fields ===
+
=== Попытка обновления доступного только для чтения столбца / полей COMPUTED BY ===
If you have COMPUTED BY fields (server-side calculated fields) in your Firebird table, SQLDB will not pick up that these are read only fields (for performance reasons).
+
Если в вашей таблице Firebird есть поля COMPUTED BY (вычисляемые поля на стороне сервера), SQLDB не будет брать в расчет, что это поля только для чтения (из соображений производительности).
  
In this case, auto-generated INSERTSQL,UPDATESQL statements can lead to error messages like "attempted update of read-only column".
+
В этом случае автоматически сгенерированные операторы INSERTSQL, UPDATESQL могут привести к сообщениям об ошибках, таких как "attempted update of read-only column" (попытка обновления столбца только для чтения).Решение состоит в том, чтобы вручную указать, что данное поле не может быть обновлено после установки свойства SQL в TSQLQuery, что-то вроде:
The solution is to manually specify that the field in question may not be updated after setting the TSQLQuery's SQL property, something like:
+
<syntaxhighlight lang=pascal>
<syntaxhighlight>
+
// Отключаем обновление этого поля или поиск измененных значений, поскольку пользователь не может изменить его
// Disable updating this field or searching for changed values as user cannot change it
 
 
sqlquery1.fieldbyname('full_name').ProviderFlags:=[];
 
sqlquery1.fieldbyname('full_name').ProviderFlags:=[];
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Bigint: lost precision ===
+
=== Bigint: потеря точности ===
If you use the bigint datatype (64 bit signed integer) in Firebird, please use .AsLargeInt instead of .AsInteger for parameters:
+
Если вы используете тип данных bigint (64-битное целое число со знаком) в Firebird, пожалуйста, используйте .AsLargeInt вместо .AsInteger для параметров:
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
// Assuming ID is bigint here
+
// Предполагая, что идентификатор здесь bigint
 
sqlquery1.sql.text := 'insert into ADDRESS (ID) values (:ID)';
 
sqlquery1.sql.text := 'insert into ADDRESS (ID) values (:ID)';
// Use this:
+
// делаем так:
sqlquery1.params.parambyname('ID').aslargeint := <some qword or 64 bit integer variable>;
+
sqlquery1.params.parambyname('ID').aslargeint := <любая qword- или 64-bit integer-переменная>;
// Do not use this:
+
// Не делайте так:
//sqlquery1.params.parambyname('ID').asinteger := <some qword or 64 bit integer variable>;
+
//sqlquery1.params.parambyname('ID').asinteger := <любая qword- или 64-bit integer-переменная>;
 
...
 
...
 
</syntaxhighlight>
 
</syntaxhighlight>
... otherwise you might get errors like duplicate PK (primary key) - if using the bigint as a primary key.
+
... в противном случае вы можете получить такие ошибки, как дубликат PK (первичного ключа) - при использовании bigint в качестве первичного ключа.
  
=== Boolean data types ===
+
=== Логические типы данных ===
Firebird versions below 3.0 do not support boolean data types.
+
Версии Firebird ниже 3.0 не поддерживают логические типы данных.
  
At least on FPC trunk (2.7.1) this datatype can be emulated:
+
По крайней мере, в транке FPC (2.7.1) этот тип данных можно эмулировать:
  
Use a DOMAIN that uses a SMALLINT type (other integer types may work as well - please test and adjust text): <syntaxhighlight lang="SQL">CREATE DOMAIN "BOOLEAN"
+
Используйте домен, который использует тип SMALLINT (другие целочисленные типы также могут работать - пожалуйста, протестируйте и настройте текст):
 +
<syntaxhighlight lang="SQL">CREATE DOMAIN "BOOLEAN"
 
  AS SMALLINT
 
  AS SMALLINT
 
  CHECK (VALUE IS NULL OR VALUE IN (-1,0,1))
 
  CHECK (VALUE IS NULL OR VALUE IN (-1,0,1))
  /* -1 used for compatibility with FPC SQLDB; 1 is used by many other data access layers */
+
  /* -1 используется для совместимости с SQLDB FPC; 1 используется многими другими слоями доступа к данным */
 
;
 
;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
  
Let your field/column use this domain type e.g. <syntaxhighlight lang="SQL">
+
Позвольте вашему полю/столбцу использовать этот тип домена, например
 +
<syntaxhighlight lang="SQL">
 
CREATE TABLE MYTABLE
 
CREATE TABLE MYTABLE
 
(
 
(
Line 152: Line 188:
 
);
 
);
 
</syntaxhighlight>
 
</syntaxhighlight>
* Now you can use .AsBoolean for assigning field values etc
+
* Теперь вы можете использовать .AsBoolean для присвоения значений полей и т.д.
 +
 
 +
'''To do: убедитесь, что это работает с гридами Lazarus и т. д..'''
  
'''To do: verify this works with Lazarus grids etc as well.'''
+
=== Проблемы INSERT INTO...RETURNING/Не открытый курсор ===
  
=== INSERT INTO...RETURNING problems/Cursor is not open ====
+
Если вы попытаетесь сделать выборку SQL (например, Query.Open) в следущем SQL-запросе:
If you try to select SQL (e.g. Query.Open) with SQL like this:
 
 
<syntaxhighlight lang="SQL">
 
<syntaxhighlight lang="SQL">
 
INSERT INTO PEOPLE (NICKNAME) VALUES ('Superman') RETURNING ID
 
INSERT INTO PEOPLE (NICKNAME) VALUES ('Superman') RETURNING ID
 
</syntaxhighlight>
 
</syntaxhighlight>
and get something like this error:
+
и получаете что-то вроде этой ошибки:
 
<syntaxhighlight lang="dos">
 
<syntaxhighlight lang="dos">
 
Database error:  : Fetch :
 
Database error:  : Fetch :
Line 169: Line 206:
 
  -Cursor is not open(error code: 335544569)
 
  -Cursor is not open(error code: 335544569)
 
</syntaxhighlight>
 
</syntaxhighlight>
while running FPC 2.6.0 (which is supplied with Lazarus 1.0) or lower, then you probably ran into an FPC SQLDB parser bug.
+
во время работы FPC 2.6.0 (которая поставляется с Lazarus 1.0) или ниже, вы, вероятно, столкнулись с ошибкой синтаксического парсера FPC SQLDB.
  
SQLDB thinks the statement you're running is a normal INSERT statement, which doesn't return data. Obviously, it should return data.
+
SQLDB считает, что выполняемый вами оператор является обычным оператором INSERT, который не возвращает данные. Очевидно, он должен возвращать данные. В более новом FPC для этого кода уже внесены исправления.
Newer FPC code has fixes for this.
 
  
If you're using generators/sequences for your primary keys (like many do), a workaround is to first get the next sequence number:
+
Если вы используете генераторы/последовательности для своих первичных ключей (как это делают многие), в качестве обходного пути вы  должны сначала получить следующий порядковый номер:
 
<syntaxhighlight lang="SQL">
 
<syntaxhighlight lang="SQL">
SELECT NEXT VALUE FOR GEN_PEOPLEID FROM RDB$DATABASE /* If your generator name is GEN_PEOPLEID */  
+
SELECT NEXT VALUE FOR GEN_PEOPLEID FROM RDB$DATABASE /* Если имя вашего генератора GEN_PEOPLEID */  
 
</syntaxhighlight>
 
</syntaxhighlight>
then use that to do a regular INSERT.
+
затем используйте это, чтобы сделать обычный INSERT.
see [http://www.firebirdfaq.org/faq111/|Firebird FAQ entry]
+
см. [http://www.firebirdfaq.org/faq111/|Firebird FAQ entry]
 +
 
 +
----
 +
[[user:Zoltanleo|Прим.перев.]]: вообще-то, мягко говоря, немного странный совет. Гораздо проще и безопаснее создать в БД триггер BeforeInsert примерно следующего содержания:
 +
<syntaxhighlight lang=sql>
 +
/* Trigger: TBL_PEOPLE_BI */
 +
CREATE OR ALTER TRIGGER TBL_PEOPLE_BI FOR TBL_PEOPLE
 +
ACTIVE BEFORE INSERT POSITION 0
 +
AS
 +
BEGIN
 +
  /* генерируем новое значение поля, если вставляемое является NULL-значением */
 +
  IF (NEW.ID IS NULL) THEN
 +
    NEW.ID = GEN_ID(GEN_PEOPLEID,1);
 +
END
 +
^
 +
</syntaxhighlight>
 +
чтобы переложить заботу о генерации PK на плечи сервера, передавая с клиента NULL-значение генератора (или не передавая его вообще, что будет восприниматься сервером, как NULL).
 +
----
  
=== Locate does not seem to work ===
+
=== Locate, кажется, не работает ===
Source: {{MantisLink|#21988}}
+
Источник: {{MantisLink|#21988}}
  
When running locate on UTF8 (or presumably other multibyte character sets) CHAR fields, locate may not find your record.
+
При запуске locate в CHAR-полях с UTF8 (или, возможно, других многобайтовых символов), locate может не найти вашу запись.
  
The problem is related mostly to UTF8 charset used and how Firebird reports column length. In case of UTF8 Firebird reports the maximum column length (in bytes) as 4*"character length". So if you have a column defined as char(8), Firebird reports 4*8=32.
+
Проблема в основном связана с используемой кодировкой UTF8 и тем, как Firebird сообщает о длине столбца. В случае UTF8 Firebird сообщает о максимальной длине столбца (в байтах) как 4 * «размер символа». Поэтому, если у вас есть столбец, определенный как char(8), Firebird сообщает 4*8=32.
  
Values are right-padded to this length 32.
+
Значения "добиваются" пробелами справа до этой длины 32. При поиске, скажем, «57200001», совпадений нет, потому что в поле фактически хранится «57200001 ........................» (с конечными пробелами, представленными здесь точками ).
When locating say '57200001' there is no match because the field actually stores '57200001 ........................' (with trailing spaces represented by dots here).
 
  
Workaround: rewrite your select query:
+
Обходной путь: перепишите ваш select-запрос:
<syntaxhighlight>
+
<syntaxhighlight lang=sql>
 
SELECT substring(THEFIELD from 1 for 8) AS THEFIELD ...
 
SELECT substring(THEFIELD from 1 for 8) AS THEFIELD ...
 
</syntaxhighlight>
 
</syntaxhighlight>
or
+
или
<syntaxhighlight>
+
<syntaxhighlight lang=sql>
 
SELECT cast(THEFIELD as varchar(8)) as THEFIELD ...
 
SELECT cast(THEFIELD as varchar(8)) as THEFIELD ...
 
</syntaxhighlight>
 
</syntaxhighlight>
or use VARCHAR fields.
+
или используйте VARCHAR-тип полей.
  
Note: this problem may occur for other databases as well depending on their reporting of field length.
+
{{Note| эта проблема может возникать и для других баз данных, в зависимости от их возвращаемой длины.}}
  
== Advanced transactions ==
+
== Подробнее о транзакциях ==
Sources for this information/further reading:  
+
Источники для этой информации / дальнейшего чтения:
* [http://www.ibphoenix.com/resources/documents/how_to/doc_400 Understanding Firebird Transactions] very detailed article
+
* [http://www.ibphoenix.com/resources/documents/how_to/doc_400 Понимание транзакций Firebird] - очень детальная статья (англ.)
* [https://ib-aid.com/en/transactions-in-firebird-acid-isolation-levels-deadlocks-and-update-conflicts-resolution/ Transactions in Firebird] another very detailed article
+
* [https://ib-aid.com/en/transactions-in-firebird-acid-isolation-levels-deadlocks-and-update-conflicts-resolution/ Транзакции в Firebird] другая очень детальная статья (англ.) ([[user:Zoltanleo|прим.перев.]]: русскоязычные аналоги от тех же авторов [http://www.ibase.ru/utl/ Жизненный цикл транзакций] и [http://www.ibase.ru/ibtrans/ Транзакции в InterBase и Firebird])
* Interbase 6 API Guide (valid for Firebird+Interbase), page 63 and further
+
* Руководство по Interbase 6 API (справедливо для Firebird+Interbase), стр. 63 и далее
* [http://conferences.embarcadero.com/article/32280 Overview of transaction settings in Interbase]
+
* [http://conferences.embarcadero.com/article/32280 Обзор настроек транзакций в Interbase] (англ.)
* [http://tech.groups.yahoo.com/group/firebird-support/message/58653 Detailed explanation of parameters in Firebird]
+
* [http://tech.groups.yahoo.com/group/firebird-support/message/58653 Подробное объяснение параметров в Firebird] (англ.)
* [http://fhasovic.blogspot.com/2005/02/transaction-isolation-levels-in.html Overview of settings in Firebird]
+
* [http://fhasovic.blogspot.com/2005/02/transaction-isolation-levels-in.html Обзор настроек в Firebird] (англ.)
* [http://www.devrace.com/en/fibplus/articles/3292.php Transaction isolation levels in 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 Уровни изоляции транзакции в FIBPlus] ([[user:zoltanleo|прим.перев.]]: ссылки на devrace'овские статьи, как и сам оригинальный сайт, увы, давно мертвы, остались лишь сохраненные статьи на сторонних ресурсах)
* README.set_transaction.txt in Firebird 2.5 documentation folder.
+
* README.set_transaction.txt в папке с документацией Firebird 2.5.
  
=== Transaction isolation levels ===
+
=== Уровни изоляции транзакций ===
If you want to, you can change the transaction isolation levels by adding a line in the transaction's Parameters property:
+
Если вы хотите, вы можете изменить уровни изоляции транзакции, добавив строку в свойстве Parameters транзакции:
* <code>isc_tpb_read_committed</code>: you see all changes committed by other transactions
+
* <code>isc_tpb_read_committed</code>: вы видите все изменения, закомиченные другими транзакциями
* <code>isc_tpb_concurrency</code>: also called Snapshot: you see database as it was when the transaction started. Has more overhead than isc_tpb_read_committed. Better than ANSI Serializable because it has no phantom reads.
+
* <code>isc_tpb_concurrency</code>: также называется Снапшотом (моментальным снимком): вы видите базу данных такой, какой она была при запуске транзакции. Имеет больше накладных расходов, чем isc_tpb_read_committed. Лучше, чем ANSI Serializable, потому что не имеет фантомных чтений.
* <code>isc_tpb_consistency</code>: also called Table Stability: stable, serializable view of data, but locks tables. Unlikely you will need this
+
* <code>isc_tpb_consistency</code>: также называется Table Stability: стабильное, сериализуемое представление данных, но блокирует таблицы. Вряд ли вам это понадобится.
  
Example:
+
Пример:
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
SQLTransaction1.Params.text:='isc_tpb_read_committed';
 
SQLTransaction1.Params.text:='isc_tpb_read_committed';
 
</syntaxhighlight>
 
</syntaxhighlight>
  
You can also add additional parameters that have an effect on the transaction (taken from the ibconnection.pp source file and [http://conferences.embarcadero.com/article/32280]):
+
Вы также можете добавить дополнительные параметры, которые влияют на транзакцию (взятые из исходного файла ibconnection.pp и [http://conferences.embarcadero.com/article/32280]):
  
=== Access mode ===
+
=== Режим доступа ===
This allow reads only or read/write
+
Этот параметр позволяет или только чтение, или чтение/запись
* <code>isc_tpb_read</code>: read permission
+
* <code>isc_tpb_read</code>: разрешение на чтение
* <code>isc_tpb_write</code>: read+write permission
+
* <code>isc_tpb_write</code>: разрешение на чтение+запись
  
=== Lock resolution ===
+
=== Обработка конфликтов блокировки ===
* <code>isc_tpb_nowait</code>: if another transaction is editing the record then don't wait
+
* <code>isc_tpb_nowait</code>: текущая транзакция откатывается с сообщением о конфликте, если запись все еще редактируется другой транзакцией
* <code>isc_tpb_wait</code>: if another transaction is editing the record then wait for it to finish. Can mitigate "live locks" in heavy contention ([http://tech.groups.yahoo.com/group/firebird-support/message/58653]). See below for timeout value.
+
* <code>isc_tpb_wait</code>: если запись все еще редактируется другой транзакцией, текущая транзакция дожидается завершения работы той, первой транзакции. Может смягчить «долгоживущие блокировки» в условиях сильной конкуренции ([http://tech.groups.yahoo.com/group/firebird-support/message/58653]). См. ниже описание параметра timeout value.
  
=== Table reservation ===
+
=== Резервирование таблиц ===
Deals with locking entire tables.
+
Соглашение по блокировкам таблиц в целом.
* <code>isc_tpb_shared</code>: first specify this, then either lock_read or lock_write for one or more tables. Shared read or write mode for tables.
+
* <code>isc_tpb_shared</code>: сначала указывается этот параметр, затем либо lock_read, либо lock_write для одной или нескольких таблиц. Разделяемый режим чтения или записи для таблиц.
* <code>isc_tpb_protected</code>: first specify this, then either lock_read or lock_write for one or more tables. Lock on tables; can allow deadlock-free operation at the cost of delayed transactions
+
* <code>isc_tpb_protected</code>: сначала указывается этот параметр, затем либо lock_read, либо lock_write для одной или нескольких таблиц. Блокировка на таблицы; может разрешить операции без блокировок за счет отложенных транзакций.
* <code>isc_tpb_lock_read</code>: Set a read lock. Specify which table to lock, e.g. isc_tpb_lock_read=CUSTOMERS
+
* <code>isc_tpb_lock_read</code>: задает блокировку чтения. Указывается, какая таблица блокируется, например, isc_tpb_lock_read=CUSTOMERS
* <code>isc_tpb_lock_write</code>: Set a read/write lock. Specify which table to lock, e.g. isc_tpb_lock_read=CUSTOMERS
+
* <code>isc_tpb_lock_write</code>: задает блокировку чтения/записи. Указывается, какая таблица блокируется, например, isc_tpb_lock_read=CUSTOMERS
Combinations:
+
Комбинации:
* Shared, lock_write: write transactions with concurrency or read committed isolation
+
* Shared, lock_write: пишущая транзакция с уровнем изоляции concurrency или read committed может обновлять таблицу. Читать таблицу может любая транзакция ([[user:Zoltanleo| прим.перев.]]: только в режиме READ ONLY (read)).
can update the table. All transactions can read the table
+
* Shared, lock_read: читать и обновлять таблицу может любая транзакция.
* Shared, lock_read: any transaction can read or update
+
* Protected, lock_write: Другие транзакции не могут обновлять таблицу. Читать таблицу могут только транзакции concurrency или read committed.
* Protected, lock_write: Other transactions cannot update the table. Only concurrency and
+
* Protected, lock_read: Другие транзакции не могут обновлять таблицу, но могут ее читать.
read committed transactions can read the table
 
* Protected, lock_read: Other transactions cannot update the table. Any transaction can
 
read the table
 
  
=== Record versions ===
+
=== Версионность записей ===
This setting is apparently only relevant for isc_tpb_read_committed isolation mode for records being modified by other transactions:
+
Этот параметр, по-видимому, относится только к режиму изоляции isc_tpb_read_committed для записей, изменяемых другими транзакциями:
* <code>isc_tpb_no_rec_version</code>: only newest record version is read. Can be useful for batch/bulk insert operations together with isc_tpb_read_committed)
+
* <code>isc_tpb_no_rec_version</code>: читается только самая новая версия записи. Может быть полезно для операций пакетной/массовой вставки вместе с isc_tpb_read_committed.
* <code>isc_tpb_rec_version</code>: the latest committed version is read, even when the other transaction has other uncommitted changes '''note: verify this'''. More overhead than isc_tpb_no_rec_version
+
* <code>isc_tpb_rec_version</code>: читается последняя подтвержденная версия записи, даже если в другой транзакции есть другие незакомиченные изменения. Больше накладных расходов, чем isc_tpb_no_rec_version.
  
=== Various options ===
+
=== Различные варианты ===
For completeness, some more options appearing in the Firebird/Interbase FPC code.
+
Для полноты, в коде Firebird/Interbase FPC появилось еще несколько опций. Скорее всего, вы будете использовать isc_tpb_no_auto_undo только для ускорения вставки/редактирования пакетов.
You will likely only ever use isc_tpb_no_auto_undo to speed up batch inserts/edits.
+
* isc_tpb_exclusive (видимо переводится как защищенный в Firebird, см. [http://tech.groups.yahoo.com/group/firebird-support/message/58653])
* isc_tpb_exclusive (apparently translates to protected in Firebird, see [http://tech.groups.yahoo.com/group/firebird-support/message/58653])
+
* isc_tpb_verb_time (Относится к отложенным ограничениям, которые могут выполняться в verb time или во время коммита. Firebird: не реализовано, всегда используйте verb time)
* isc_tpb_verb_time (Related to deferred constraints, which could execute at verb time or commit time. Firebird: not implemented, always use verb time)
+
* isc_tpb_commit_time (Относится к отложенным ограничениям, которые могут выполняться в verb time или в commit time. Firebird: не реализовано, всегда используйте verb time)
* isc_tpb_commit_time (Related to deferred constraints, which could execute at verb time or commit time. Firebird: not implemented, always use verb time)
+
* isc_tpb_ignore_limbo (игнорирует записи, созданные limbo-транзакциями. limbo-транзакции - это незавершенные транзакции в двухфазном коммите при работе с несколькими базами данных. Вряд ли вам понадобится эта функция)
* isc_tpb_ignore_limbo (ignores the records created by transactions in limbo. Limbo transactions are failing two-phase commits in multi-database transactions. Unlikely that you will need this feature)
+
* isc_tpb_autocommit (автокоммит транзакции: каждый оператор является отдельной транзакцией. Вероятно, специально для драйвера JDB JayBird.)
* isc_tpb_autocommit (autocommit this transaction: every statement is a separate transaction. Probably specifically for JayBird JDBC driver.)
+
* isc_tpb_restart_requests (очевидно, ищет запросы в соединении, которые были активны в другой транзакции, прибивает их и перезапускает в новой транзакции.)
* isc_tpb_restart_requests (apparently looks for requests in the connection which had been active in another transaction, unwinds them, and restarts them under the new transaction.)
+
* isc_tpb_no_auto_undo (отключает журнал отмен на уровне транзакций, что удобно для получения максимальной пропускной способности при выполнении пакетного обновления. Не имеет эффекта при данных только для чтения.)
* isc_tpb_no_auto_undo (disable transaction-level undo log, handy for getting max throughput when performing a batch update. Has no effect when only reading data.)
+
* isc_tpb_lock_timeout (укажите количество секунд ожидания для снятия блокировки, если вы используете isc_tpb_wait. Если это значение достигнуто без снятия блокировки, выдается сообщение об ошибке.)
* isc_tpb_lock_timeout (specify number of seconds to wait for lock release, if you use isc_tpb_wait. If this value is reached without lock release, an error is reported.)
 
  
=== Firebird and ISO transactions ===
+
=== Firebird и транзакции по стандарту ANSI/ISO SQL===
Firebird transaction do not map 1 to 1 to ISO/ANSI transaction levels. An approximation is:
+
Транзакции Firebird не соответствуют 1 в 1 уровню транзакции стандарта ISO/ANSI. Приблизительно так:
 
* ISO Read Committed=READ COMMITTED+RECORD_VERSION
 
* ISO Read Committed=READ COMMITTED+RECORD_VERSION
 
* ISO Read Committed=READ COMMITTED+NO RECORD_VERSION
 
* ISO Read Committed=READ COMMITTED+NO RECORD_VERSION
* ISO Repeatable Read=SNAPSHOT (also known as CONCURRENCY)
+
* ISO Repeatable Read=SNAPSHOT (также известная как CONCURRENCY)
* ISO Serializable=SNAPSHOT TABLE STABILITY (also known as CONSISTENCY)
+
* ISO Serializable=SNAPSHOT TABLE STABILITY (также известная как CONSISTENCY)
  
=== Common combinations ===
+
=== Общие комбинации ===
Default is (probably, will have to check) read committed.
+
По умолчанию (возможно, придется проверить) read committed.
  
==== Batch/bulk insert ====
+
==== Пакетная/массовая вставка ====
isc_tpb_read_committed and isc_tpb_no_rec_version could be a good combination: it allows other transactions to function while the batch is going on.
+
isc_tpb_read_committed и isc_tpb_no_rec_version могут быть хорошей комбинацией: она позволяет другим транзакциям функционировать во время выполнения пакетной вставки.
  
==== Read only transaction ====
+
==== Транзакции только для чтения ====
If you want to only have read access to the database, you can do so by setting these transaction parameters:
+
Если вы хотите иметь доступ только для чтения к базе данных, вы можете сделать это, установив следующие параметры транзакции:
 
* <code>isc_tpb_read</code>
 
* <code>isc_tpb_read</code>
 
* <code>isc_tpb_read_committed</code>
 
* <code>isc_tpb_read_committed</code>
 
* <code>isc_tpb_rec_version</code>
 
* <code>isc_tpb_rec_version</code>
 
* <code>nowait</code>
 
* <code>nowait</code>
This combination will not block garbage collection, which is a good thing.
+
Эта комбинация не будет блокировать сборку мусора, что само по себе хорошо.
Source: [http://tech.groups.yahoo.com/group/firebird-support/message/118748]
+
Источник: [http://tech.groups.yahoo.com/group/firebird-support/message/118748]
  
Note: the [http://www.firebirdfaq.org/faq164/ Firebird FAQ] indicates you will need write access to the database file even if you only read from it, unless you set the database read-only flag (e.g. using gfix).
+
{{Note| [http://www.firebirdfaq.org/faq164/ Firebird FAQ] указывает, что вам понадобится доступ с правом записи в файл базы данных, даже если вы только читаете из него, если вы не установите флаг базы данных read-only [только для чтения] (например, с помощью утилиты gfix).}}
  
== Links and more information ==
+
== Ссылки и дополнительная информация ==
  
The list below shows links to more information on Firebird and related tools.
+
В списке ниже приведены ссылки на дополнительную информацию о Firebird и связанных с ней инструментах.
* [[Firebird_embedded|Using Firebird embedded with FPC/Lazarus]]
+
* [[Firebird_embedded/ru|Использование Firebird embedded с приложениями FPC/Lazarus]]
  
=== Lazarus Firebird samples ===
+
=== Примеры Lazarus Firebird ===
* Sample Lazarus/Firebird application source code [http://lazarus.freepascal.org/index.php/topic,13940.msg73617.html#msg73617]
+
* Примеры исходного кода приложения Lazarus/Firebird [http://lazarus.freepascal.org/index.php/topic,13940.msg73617.html#msg73617]
* Firebird/SQLDB tutorials:  
+
* Учебники Firebird/SQLDB:  
 
** [[SQLdb Tutorial0]]
 
** [[SQLdb Tutorial0]]
 
** [[SQLdb Tutorial1]]
 
** [[SQLdb Tutorial1]]
Line 306: Line 354:
 
** [[SQLdb Tutorial4]]
 
** [[SQLdb Tutorial4]]
  
*PP4S tutorials; cover Firebird installation on Windows as well:
+
*Учебники по PP4S; включает установку Firebird на Windows, а также
** [http://www.pp4s.co.uk/main/tu-db-plan.html Planning a Database]
+
** [http://www.pp4s.co.uk/main/tu-db-plan.html Планирование базы данных (англ.)]
** [http://www.pp4s.co.uk/main/tu-db-installingfirebird01.html Installing Firebird]
+
** [http://www.pp4s.co.uk/main/tu-db-installingfirebird01.html Установка Firebird (англ.)]
** [http://www.pp4s.co.uk/main/tu-db-firebird-create.html Creating a Firebird database]
+
** [http://www.pp4s.co.uk/main/tu-db-firebird-create.html Создание базы данных Firebird (англ.)]
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo1.html Editing a Firebird database]
+
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo1.html Редактирование базы данных Firebird (англ.)]
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo2.html Searching a Firebird database]
+
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo2.html Поиск в базе данных Firebird (англ.)]
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo3.html Creating and printing a report]
+
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo3.html Создание и печать отчетов (англ.)]
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo4.html Creating and using stored procedures]
+
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo4.html Создание и использование хранимых процедур (англ.)]
  
=== Tools ===
+
=== Инструменты администрирования===
* FlameRobin [http://www.flamerobin.org/ Flamerobin site] Open source GUI tool to manage Firebird, available for Linux, Windows and Mac OSX. Highly recommended.
+
* [http://www.flamerobin.org/ FlameRobin] - GUI инструмент с открытым исходным кодом для управления Firebird, доступный для Linux, Windows и macOS. Настоятельно рекомендуется.
* Turbobird [https://github.com/motaz/turbobird Turbobird site] Open source GUI tool to manage Firebird. Written with Lazarus using TIBConnection
+
* [https://github.com/motaz/turbobird Turbobird] - GUI инструмент с открытым исходным кодом для управления Firebird. Написано с помощью Lazarus с использованием TIBConnection.
* ibconsole : Tool to manage Firebird an Interbase Databases with a GUI, available for Windows and Linux
+
* ibconsole : инструмент для управления Firebird и базами данных Interbase с графическим интерфейсом, доступен для Windows и Linux.
* Lazarus Data Desktop - included in the Lazarus repository (found in the 'tools/lazdatadesktop/' directory)
+
* Lazarus Data Desktop - входит в репозиторий Lazarus (находится в каталоге 'tools/lazdatadesktop/').
* [http://lazsqlx.wordpress.com/ LazSQLX] Multi-database open source database management tool. Written with Lazarus using both SQLDB and Zeos components. Includes support for Firebird.  
+
* [http://lazsqlx.wordpress.com/ LazSQLX]- многофункциональный инструмент управления базами данных с открытым исходным кодом. Написан на Lazarus с использованием компонентов как SQLDB, так и Zeos. Включает поддержку Firebird.  
* tiSQLEditor - included in the "Support Apps" directory of the [[tiOPF]] repository. It is a tool used to write SQL with some code completion support, can run scripts, execute upgrade scripts for applications from one build to a later build, has various handy copy and paste functions for Object Pascal applications, has many features that are useful to tiOPF (creates Object Pascal code templates from query results, for tiOPF's visitor classes), export query results to CSV etc.
+
* tiSQLEditor - включен в каталог «Support Apps» репозитория [[tiOPF]]. Это инструмент, используемый для написания SQL с некоторой поддержкой автозавершения кода, может запускать сценарии, выполнять сценарии обновления для приложений от одной сборки до более поздней сборки, имеет различные удобные функции копирования и вставки для приложений Object Pascal, имеет много функций, которые полезны для tiOPF (создает шаблоны кода Object Pascal из результатов запросов, для классов посетителей tiOPF), экспортирует результаты запросов в CSV и т.д.
 +
* [[user:Zoltanleo|Прим.перев.]]: [http://www.ibexpert.net/ibe/ IBExpert] - ИМХО, лучший 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 здесь].
  
 
=== Firebird ===
 
=== Firebird ===
* The Firebird RDBMS [http://firebirdsql.org/ Firebird site]. This site also contains a lot of documentation on Firebird.
+
* РСУБД [http://firebirdsql.org/ Firebird]. Этот сайт также содержит много документации по Firebird.
* Firebird FAQ [http://firebirdfaq.org/]. Handy site that shows e.g. differences with other RDBMS.
+
* Firebird [http://firebirdfaq.org/ FAQ]. Удобный сайт, который показывает, например, отличия от других РСУБД.
* New site that shows how to use the latest tools and LibreOffice, FPC to be added soon [http://www.controlpascal.com/firebird.htm Firebird]
+
* [http://www.controlpascal.com/firebird.htm Новый сайт], который показывает, как использовать новейшие инструменты и LibreOffice, FPC будет добавлен в ближайшее время.
 
<br/>
 
<br/>

Latest revision as of 02:50, 16 February 2020

English (en) français (fr) русский (ru)

Databases portal

References:

Tutorials/practical articles:

Databases

Advantage - MySQL - MSSQL - Postgres - Interbase - Firebird - Oracle - ODBC - Paradox - SQLite - dBASE - MS Access - Zeos

Это руководство по использованию базы данных Firebird в Lazarus/FPC, с использованием Firebird с SQLDB (встроенная библиотека базы данных FPC/Lazarus). Другие методы доступа описаны в разделе Другие библиотеки Firebird.

Обзор

Firebird - это бесплатный сервер баз данных с открытым исходным кодом, который использовался и разрабатывался десятилетиями (он разрабатывался на основе базы данных Interbase 6, исходные коды которой были открыты компанией Borland). Он включает в себя расширенную поддержку операторов SQL (например, INSERT...RETURNING), хранимых процедур, триггеров и т.д. Вы можете написать скомпилированные библиотеки UDF (библиотеки пользовательских функций) для сервера в FreePascal, если вы хотите расширить и без того обширный список функций Firebird.

База данных требует очень мало ручной работы администратора баз данных после того, как она настроена, что делает ее идеальной для использования в малом бизнесе или для встроенного использования. При правильной настройке он может вырасти до терабайтного масштаба, хотя PostgreSQL может быть лучшим выбором для таких больших сред.

Firebird предлагает как встроенную (основанную на файлах), так и клиент-серверную базу данных - которую можно использовать без необходимости изменять одну строку кода в FPC/Lazarus. При использовании в качестве встроенной базы данных она предлагает более богатую поддержку SQL, чем SQLite, а также плавную миграцию в базу данных клиент-сервер, хотя SQLite сама по себе является вполне встроенной базой данных.

Последняя стабильная версия, Firebird 2.5 (прим.перев.: на момент перевода статьи - это версия Firebird 3.0.4), работает в Windows (32- и 64-разрядная версия), различных версиях Linux (32- и 64-разрядная версия), Solaris (Sparc и Intel), HP-UX (PA-Risc) и macOS.

В настоящее время сервер портируется на Android; он пока недоступен в Windows CE/Windows Mobile.

Поддержка Firebird в SQLDB компилятора довольно хорошая, сравнимая с уровнем поддержки PostgreSQL.

Документация

Официальная документация включена в FPC 2.6.2+: Документация SQLDB для IBConnection

Установка режимов клиент/сервер и встроенного режима сервера

Firebird может работать в режиме клиент/сервер и в режиме встроенного сервера.

Client/Server означает, что у вас где-то есть физический сервер Firebird: либо на локальной машине, либо на другой машине, доступной по вашей сети. Соединения с сервером проходят через TCP/IP; при указании соединения имя хоста содержит имя или IP-адрес. Серверу Firebird для "общения" с вашими компонентами доступа необходима fbclient.dll/fbclient.so.nnn (вместе с его файлами поддержки).

Embedded Firebird означает, что ваше приложение для доступа к базе данных Firebird на локальной машине загружает единственную библиотеку, которая является и сервером, и клиентской библиотекой Firebird "в одном флаконе". При указании строки соединения имя хоста всегда пусто (не указывается). Серверу Firebird для "общения" с вашими компонентами доступа необходима fbembed.dll/fbembed.so (вместе с его файлами поддержки). См. вики-страницу на Firebird embedded для более подробной информации.

Обратите внимание, что fbembed.dll может использоваться как для клиент-серверного, так и для встроенного использования, поэтому установка только этой dll может быть разумной задачей.


Прим.перев.: необходимо уточнить, что выше описанное справедливо для версий FB 1.5, FB 2.0, FB 2.1 и FB 2.5. Начиная с версии FB 3.0, режим используемого сервера зависит от строки подключения, а клиентская библиотека на все случаи жизни одна - все та же fbclient.dll/libfbclient.so.3.0.n (где n - номер билда версии FB).


Windows

Win64: пожалуйста, см. предупреждение здесь о нежелательном использовании некоторых версий FPC/Lazarus Win64.

Для Windows: (это относится ко всем драйверам базы данных SQLDB) необходимо иметь fbclient.dll (или fbembed.dll' ) и его поддержку dll, установленных в:

  • каталог проекта и каталог вывода исполняемого файла/каталог приложения (например, lib /что-то еще в каталоге вашего проекта)
  • или каталог в вашем PATH (не в системном каталоге)
  • Если вы хотите использовать системный каталог, пожалуйста, используйте официальный установщик и поставьте галочку «скопировать fbclient в системный каталог»

Как и для всех библиотек DLL (базы данных), разрядность библиотеки DLL должна соответствовать вашему приложению: используйте 32-разрядную библиотеку для 32-разрядной скомпилированной программы и 64-разрядную библиотеку для 64-разрядной программы.

Unix/Linux/macOS

В Linux/macOS/FreeBSD должна быть установлена ​​клиентская библиотека Firebird (например, вашим менеджером пакетов; установите обычный пакет и пакет -dev), или они должны быть прописаны в путях поиска библиотеки.

FPC ищет наиболее распространенные имена библиотек (например, libfbclient.so.2.5, libgds.so и libfbembed.so.2.5; пожалуйста, проверьте ibase60.inc, если ваша версия отличается). При желании можно указать имя библиотеки. Есть 2 способа сделать это:

  • использовать компонент TSQLDBLibraryLoader из sqldblib (FPC 2.7.1). Работает для всех компонентов коннектора SQLDB.
  • вызвать функцию
    function InitialiseIBase60(Const LibraryName : AnsiString) : integer;
    
    с правильным именем библиотеки (для этого может потребоваться использовать модуль ibase60dyn).

Примеры подключения

1. Пример для client/server:

Hostname: 192.168.1.1
* База данных находится на сервере с IP-адресом 192.168.1.1.
DatabaseName: /interdata/example.fdb  
* Имя файла базы данных - "example.fdb" в каталоге /interdata сервера (машина с IP-адресом 192.168.1.1).
Username: SYSDBA
Password: masterkey

2. Другой пример client/server:

Hostname: dbhost
* База данных находится на сервере с именем хоста dbhost
DatabaseName: F:\Program Files\firebird\examples\employee.fdb  
* Имя файла базы данных - "employee.fdb" в каталоге Program Files\firebird\examples на диске F: dbhost.
Username: SYSDBA
Password: masterkey

3. Пример для embedded-режима:

Hostname: <пустая строка>
* Оставляя имя хоста пустым, выбирается embedded-режим.
DatabaseName: test.fdb
* Файл базы данных "test.fdb" находится в каталоге запускаемого приложения (убедитесь, что fbembed.dll находится в каталоге исполняемого файла приложения)
Username: SYSDBA
* Для встроенного сервера вы должны указать имя пользователя ...
Password: <пустая строка> (прим.перев.: вообще-то, это может быть любая строка, в т.ч. и пустая)
* ... но не важно, какой пароль вы укажете.

Прим.перев.: выше приведенные примеры подразумевают, что используется порт по умолчанию 3050. Если номер порта отличается от стандартного (например, пусть будет 3051), то для каждого из выше приведенных примеров строка подключения (например, к утилите isql) соответственно будет выглядеть следующим образом:

SQL>connect '192.168.1.1/3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';
SQL>connect 'dbhost/3051:F:\Program Files\firebird\examples\employee.fdb' -user 'SYSDBA' -password 'masterkey';
SQL>connect 'test.fdb' -user 'SYSDBA' -password '';


Начиная с версии FB 3 появилась возможность указывать другие протоколы коннекта:

  • INET-протокол (для TCP/IP) в виде строки <host>[/<port>]:<database file path or alias>

Тогда строка подключения (например, к утилите isql) для выше указанных примеров соответственно будет выглядеть так:

SQL>connect 'inet://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';
SQL>connect 'inet://dbhost:3051:F:\Program Files\firebird\examples\employee.fdb' -user 'SYSDBA' -password 'masterkey';
SQL>connect 'inet://test.fdb' -user 'SYSDBA' -password '';

INET-протокол поддерживает URL-стиль (для адресов IPv4 и IPv6) строки подключения вы виде шаблона [<protocol>://[<host>[:<port>]]]/<database file path or alias>. Тогда в строке подключения часть строки заменяется с inet:// на inet4:// или inet6:// соответственно. Например:

SQL>connect 'inet6://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';
Light bulb  Примечание: по умолчанию Firebird прослушивает нулевой адрес IPv6 (: :) и принимает все входящие соединения, будь то IPv4 или IPv6. Если эти адреса имеют ненулевое значение, то в строке подключения они обрамляются квадратными скобками, чтобы устранить двусмысленность при использовании двоеточия в качестве разделителя

.

Например, если IPv6 = 2014:1234::5, то строка подключения примет вид:

SQL>connect '[2014:1234::5]://192.168.1.1:3051:/interdata/example.fdb' -user 'SYSDBA' -password 'masterkey';

и далее по аналогии...

  • протокол NetBEUI, или WNET (именованные каналы) - только для Windows! - в виде строки \\<host>[@<port>]\<database file path or alias>.
  • протокол XNET для локальных подключений с использованием общей памяти.

Последние два протокола имеют строку подключения, аналогичную INET, только вместо inet:// подставляются wnet:// или xnet:// соответственно.

Более подробную информацию по нововведениям FB 3, в том числе и по протоколам коннекта можно посмотреть здесь.


Устранение проблем с доступом client/server

Убедитесь, что вы запустили сервер Interbase/Firebird на указанном вами IP-адресе/имени хоста сервера. Вы можете проверить подключение, подключившись к компьютеру через telnet. Firebird обычно слушает порт 3050:

telnet 192.168.1.1 3050

Вы должны увидеть что-то, может быть, просто пустой экран, но вы можете что-то напечатать. Это означает, что вы можете отправлять данные в базу данных Firebird.

Для получения дополнительной информации см. документацию Firebird.

Мониторинг событий

FPC/Lazarus поставляется с компонентом для мониторинга событий, поступающих из баз данных Firebird; см. TFBEventMonitor.

Программное создание объектов

Хотя для создания таблиц и т.д. можно использовать такие инструменты, как Flamerobin (прим.перев.: для windows, особенно русскоязычной, предпочтительнее использовать IBExpert), вы также можете создавать объекты БД программно/динамически, что может быть удобно, если вы хотите, чтобы ваши программы обновляли существующие схемы базы данных до новой схемы.

Вы можете использовать, например, TSQLQuery.ExecSQL для выполнения этой задачи:

Query.ExecSQL('CREATE TABLE TEST(ID INTEGER NOT NULL, TESTNAME VARCHAR(800))');
// Вам необходимо закомиттить транзакцию после DDL перед любыми инструкциями DML - SELECT, INSERT и т. Д.
//В противном случае SQL не увидит созданные объекты

Используйте для этих целей объект TSQLScript - см. TSQLScript.

Администрирование базы данных

У FPC/Lazarus есть компонент для администрирования базы данных; см. TFBAdmin

Общие проблемы и решения

Иногда использование Firebird в Lazarus кажется сложным. Пожалуйста, поищите решения ниже по тексту.

Попытка обновления доступного только для чтения столбца / полей COMPUTED BY

Если в вашей таблице Firebird есть поля COMPUTED BY (вычисляемые поля на стороне сервера), SQLDB не будет брать в расчет, что это поля только для чтения (из соображений производительности).

В этом случае автоматически сгенерированные операторы INSERTSQL, UPDATESQL могут привести к сообщениям об ошибках, таких как "attempted update of read-only column" (попытка обновления столбца только для чтения).Решение состоит в том, чтобы вручную указать, что данное поле не может быть обновлено после установки свойства SQL в TSQLQuery, что-то вроде:

// Отключаем обновление этого поля или поиск измененных значений, поскольку пользователь не может изменить его
sqlquery1.fieldbyname('full_name').ProviderFlags:=[];

Bigint: потеря точности

Если вы используете тип данных bigint (64-битное целое число со знаком) в Firebird, пожалуйста, используйте .AsLargeInt вместо .AsInteger для параметров:

// Предполагая, что идентификатор здесь bigint
sqlquery1.sql.text := 'insert into ADDRESS (ID) values (:ID)';
// делаем так:
sqlquery1.params.parambyname('ID').aslargeint := <любая qword- или 64-bit integer-переменная>;
// Не делайте так:
//sqlquery1.params.parambyname('ID').asinteger := <любая qword- или 64-bit integer-переменная>;
...

... в противном случае вы можете получить такие ошибки, как дубликат PK (первичного ключа) - при использовании bigint в качестве первичного ключа.

Логические типы данных

Версии Firebird ниже 3.0 не поддерживают логические типы данных.

По крайней мере, в транке FPC (2.7.1) этот тип данных можно эмулировать:

Используйте домен, который использует тип SMALLINT (другие целочисленные типы также могут работать - пожалуйста, протестируйте и настройте текст):

CREATE DOMAIN "BOOLEAN"
 AS SMALLINT
 CHECK (VALUE IS NULL OR VALUE IN (-1,0,1))
 /* -1 используется для совместимости с SQLDB FPC; 1 используется многими другими слоями доступа к данным */
;


Позвольте вашему полю/столбцу использовать этот тип домена, например

CREATE TABLE MYTABLE
(
...
  MYBOOLEANCOLUMN "BOOLEAN",
);
  • Теперь вы можете использовать .AsBoolean для присвоения значений полей и т.д.

To do: убедитесь, что это работает с гридами Lazarus и т. д..

Проблемы INSERT INTO...RETURNING/Не открытый курсор

Если вы попытаетесь сделать выборку SQL (например, Query.Open) в следущем SQL-запросе:

INSERT INTO PEOPLE (NICKNAME) VALUES ('Superman') RETURNING ID

и получаете что-то вроде этой ошибки:

Database error:  : Fetch :
 -Dynamic SQL Error
 -SQL error code = -504
 -Invalid cursor reference
 -Cursor is not open(error code: 335544569)

во время работы FPC 2.6.0 (которая поставляется с Lazarus 1.0) или ниже, вы, вероятно, столкнулись с ошибкой синтаксического парсера FPC SQLDB.

SQLDB считает, что выполняемый вами оператор является обычным оператором INSERT, который не возвращает данные. Очевидно, он должен возвращать данные. В более новом FPC для этого кода уже внесены исправления.

Если вы используете генераторы/последовательности для своих первичных ключей (как это делают многие), в качестве обходного пути вы должны сначала получить следующий порядковый номер:

SELECT NEXT VALUE FOR GEN_PEOPLEID FROM RDB$DATABASE /* Если имя вашего генератора GEN_PEOPLEID */

затем используйте это, чтобы сделать обычный INSERT. см. FAQ entry


Прим.перев.: вообще-то, мягко говоря, немного странный совет. Гораздо проще и безопаснее создать в БД триггер BeforeInsert примерно следующего содержания:

/* Trigger: TBL_PEOPLE_BI */
CREATE OR ALTER TRIGGER TBL_PEOPLE_BI FOR TBL_PEOPLE
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  /* генерируем новое значение поля, если вставляемое является NULL-значением */
  IF (NEW.ID IS NULL) THEN 
    NEW.ID = GEN_ID(GEN_PEOPLEID,1);
END
^

чтобы переложить заботу о генерации PK на плечи сервера, передавая с клиента NULL-значение генератора (или не передавая его вообще, что будет восприниматься сервером, как NULL).


Locate, кажется, не работает

Источник: Issue ##21988

При запуске locate в CHAR-полях с UTF8 (или, возможно, других многобайтовых символов), locate может не найти вашу запись.

Проблема в основном связана с используемой кодировкой UTF8 и тем, как Firebird сообщает о длине столбца. В случае UTF8 Firebird сообщает о максимальной длине столбца (в байтах) как 4 * «размер символа». Поэтому, если у вас есть столбец, определенный как char(8), Firebird сообщает 4*8=32.

Значения "добиваются" пробелами справа до этой длины 32. При поиске, скажем, «57200001», совпадений нет, потому что в поле фактически хранится «57200001 ........................» (с конечными пробелами, представленными здесь точками ).

Обходной путь: перепишите ваш select-запрос:

SELECT substring(THEFIELD from 1 for 8) AS THEFIELD ...

или

SELECT cast(THEFIELD as varchar(8)) as THEFIELD ...

или используйте VARCHAR-тип полей.

Light bulb  Примечание: эта проблема может возникать и для других баз данных, в зависимости от их возвращаемой длины.

Подробнее о транзакциях

Источники для этой информации / дальнейшего чтения:

Уровни изоляции транзакций

Если вы хотите, вы можете изменить уровни изоляции транзакции, добавив строку в свойстве Parameters транзакции:

  • isc_tpb_read_committed: вы видите все изменения, закомиченные другими транзакциями
  • isc_tpb_concurrency: также называется Снапшотом (моментальным снимком): вы видите базу данных такой, какой она была при запуске транзакции. Имеет больше накладных расходов, чем isc_tpb_read_committed. Лучше, чем ANSI Serializable, потому что не имеет фантомных чтений.
  • isc_tpb_consistency: также называется Table Stability: стабильное, сериализуемое представление данных, но блокирует таблицы. Вряд ли вам это понадобится.

Пример:

SQLTransaction1.Params.text:='isc_tpb_read_committed';

Вы также можете добавить дополнительные параметры, которые влияют на транзакцию (взятые из исходного файла ibconnection.pp и [1]):

Режим доступа

Этот параметр позволяет или только чтение, или чтение/запись

  • isc_tpb_read: разрешение на чтение
  • isc_tpb_write: разрешение на чтение+запись

Обработка конфликтов блокировки

  • isc_tpb_nowait: текущая транзакция откатывается с сообщением о конфликте, если запись все еще редактируется другой транзакцией
  • isc_tpb_wait: если запись все еще редактируется другой транзакцией, текущая транзакция дожидается завершения работы той, первой транзакции. Может смягчить «долгоживущие блокировки» в условиях сильной конкуренции ([2]). См. ниже описание параметра timeout value.

Резервирование таблиц

Соглашение по блокировкам таблиц в целом.

  • isc_tpb_shared: сначала указывается этот параметр, затем либо lock_read, либо lock_write для одной или нескольких таблиц. Разделяемый режим чтения или записи для таблиц.
  • isc_tpb_protected: сначала указывается этот параметр, затем либо lock_read, либо lock_write для одной или нескольких таблиц. Блокировка на таблицы; может разрешить операции без блокировок за счет отложенных транзакций.
  • isc_tpb_lock_read: задает блокировку чтения. Указывается, какая таблица блокируется, например, isc_tpb_lock_read=CUSTOMERS
  • isc_tpb_lock_write: задает блокировку чтения/записи. Указывается, какая таблица блокируется, например, isc_tpb_lock_read=CUSTOMERS

Комбинации:

  • Shared, lock_write: пишущая транзакция с уровнем изоляции concurrency или read committed может обновлять таблицу. Читать таблицу может любая транзакция ( прим.перев.: только в режиме READ ONLY (read)).
  • Shared, lock_read: читать и обновлять таблицу может любая транзакция.
  • Protected, lock_write: Другие транзакции не могут обновлять таблицу. Читать таблицу могут только транзакции concurrency или read committed.
  • Protected, lock_read: Другие транзакции не могут обновлять таблицу, но могут ее читать.

Версионность записей

Этот параметр, по-видимому, относится только к режиму изоляции isc_tpb_read_committed для записей, изменяемых другими транзакциями:

  • isc_tpb_no_rec_version: читается только самая новая версия записи. Может быть полезно для операций пакетной/массовой вставки вместе с isc_tpb_read_committed.
  • isc_tpb_rec_version: читается последняя подтвержденная версия записи, даже если в другой транзакции есть другие незакомиченные изменения. Больше накладных расходов, чем isc_tpb_no_rec_version.

Различные варианты

Для полноты, в коде Firebird/Interbase FPC появилось еще несколько опций. Скорее всего, вы будете использовать isc_tpb_no_auto_undo только для ускорения вставки/редактирования пакетов.

  • isc_tpb_exclusive (видимо переводится как защищенный в Firebird, см. [3])
  • isc_tpb_verb_time (Относится к отложенным ограничениям, которые могут выполняться в verb time или во время коммита. Firebird: не реализовано, всегда используйте verb time)
  • isc_tpb_commit_time (Относится к отложенным ограничениям, которые могут выполняться в verb time или в commit time. Firebird: не реализовано, всегда используйте verb time)
  • isc_tpb_ignore_limbo (игнорирует записи, созданные limbo-транзакциями. limbo-транзакции - это незавершенные транзакции в двухфазном коммите при работе с несколькими базами данных. Вряд ли вам понадобится эта функция)
  • isc_tpb_autocommit (автокоммит транзакции: каждый оператор является отдельной транзакцией. Вероятно, специально для драйвера JDB JayBird.)
  • isc_tpb_restart_requests (очевидно, ищет запросы в соединении, которые были активны в другой транзакции, прибивает их и перезапускает в новой транзакции.)
  • isc_tpb_no_auto_undo (отключает журнал отмен на уровне транзакций, что удобно для получения максимальной пропускной способности при выполнении пакетного обновления. Не имеет эффекта при данных только для чтения.)
  • isc_tpb_lock_timeout (укажите количество секунд ожидания для снятия блокировки, если вы используете isc_tpb_wait. Если это значение достигнуто без снятия блокировки, выдается сообщение об ошибке.)

Firebird и транзакции по стандарту ANSI/ISO SQL

Транзакции Firebird не соответствуют 1 в 1 уровню транзакции стандарта ISO/ANSI. Приблизительно так:

  • ISO Read Committed=READ COMMITTED+RECORD_VERSION
  • ISO Read Committed=READ COMMITTED+NO RECORD_VERSION
  • ISO Repeatable Read=SNAPSHOT (также известная как CONCURRENCY)
  • ISO Serializable=SNAPSHOT TABLE STABILITY (также известная как CONSISTENCY)

Общие комбинации

По умолчанию (возможно, придется проверить) read committed.

Пакетная/массовая вставка

isc_tpb_read_committed и isc_tpb_no_rec_version могут быть хорошей комбинацией: она позволяет другим транзакциям функционировать во время выполнения пакетной вставки.

Транзакции только для чтения

Если вы хотите иметь доступ только для чтения к базе данных, вы можете сделать это, установив следующие параметры транзакции:

  • isc_tpb_read
  • isc_tpb_read_committed
  • isc_tpb_rec_version
  • nowait

Эта комбинация не будет блокировать сборку мусора, что само по себе хорошо. Источник: [4]

Light bulb  Примечание: Firebird FAQ указывает, что вам понадобится доступ с правом записи в файл базы данных, даже если вы только читаете из него, если вы не установите флаг базы данных read-only [только для чтения] (например, с помощью утилиты gfix).

Ссылки и дополнительная информация

В списке ниже приведены ссылки на дополнительную информацию о Firebird и связанных с ней инструментах.

Примеры Lazarus Firebird

Инструменты администрирования

  • FlameRobin - GUI инструмент с открытым исходным кодом для управления Firebird, доступный для Linux, Windows и macOS. Настоятельно рекомендуется.
  • Turbobird - GUI инструмент с открытым исходным кодом для управления Firebird. Написано с помощью Lazarus с использованием TIBConnection.
  • ibconsole : инструмент для управления Firebird и базами данных Interbase с графическим интерфейсом, доступен для Windows и Linux.
  • Lazarus Data Desktop - входит в репозиторий Lazarus (находится в каталоге 'tools/lazdatadesktop/').
  • LazSQLX- многофункциональный инструмент управления базами данных с открытым исходным кодом. Написан на Lazarus с использованием компонентов как SQLDB, так и Zeos. Включает поддержку Firebird.
  • tiSQLEditor - включен в каталог «Support Apps» репозитория tiOPF. Это инструмент, используемый для написания SQL с некоторой поддержкой автозавершения кода, может запускать сценарии, выполнять сценарии обновления для приложений от одной сборки до более поздней сборки, имеет различные удобные функции копирования и вставки для приложений Object Pascal, имеет много функций, которые полезны для tiOPF (создает шаблоны кода Object Pascal из результатов запросов, для классов посетителей tiOPF), экспортирует результаты запросов в CSV и т.д.
  • Прим.перев.: IBExpert - ИМХО, лучший GUI-инструмент для администрирования БД Firebird под Windows. Постоянно обновляемый, с активным русскоязычным коммунити, бесплатен для пользователей Windows с кодовой страницей Win1251 (в основном, жителей exUSSR). В комплекте SQL-редактор с подсветкой синтаксиса и автозавершением слов, редактор скриптов, построитель запросов, поддержка IBEScript, менеждер прав и пользователей, печать и экспорт данных в различные форматы и проч.проч. Скачать можно по прямой ссылке здесь в виде самораспаковывающегося архива. Документация представлена здесь.

Firebird

  • РСУБД Firebird. Этот сайт также содержит много документации по Firebird.
  • Firebird FAQ. Удобный сайт, который показывает, например, отличия от других РСУБД.
  • Новый сайт, который показывает, как использовать новейшие инструменты и LibreOffice, FPC будет добавлен в ближайшее время.