Показаны сообщения с ярлыком firebird. Показать все сообщения
Показаны сообщения с ярлыком firebird. Показать все сообщения

пятница, 24 декабря 2021 г.

Связки баз разных СУБД

По аналогии с DBLink. При необходимости использования одной базы в качестве источника данных для другой базы на уровне SQL-запросов можно использовать:

- oracle_fdw;

- postgres_fdw;

- firebird_fdw.

пятница, 29 января 2021 г.

Подключение к Firebird 3.0 с помощью Python 3

Описание проблемы:

Выполнение python-кода:

import fdb

con = fdb.connect(dsn='127.0.0.1/3050:base.fdb', user='SYSDBA', password='masterkey', charset='WIN1251')

прерывается ошибкой:

Traceback (most recent call last):

  File "try.py", line 4, in <module>

    con = fdb.connect(dsn='127.0.0.1/3050:base.fdb', user='SYSDBA', password='masterkey')

  File "C:\python38-32\\lib\site-packages\fdb\fbcore.py", line 800, in connect

    load_api(fb_library_name)

  File "C:\python38-32\\lib\site-packages\fdb\fbcore.py", line 231, in load_api

    setattr(sys.modules[__name__], 'api', ibase.fbclient_API(fb_library_name))

  File "C:\python38-32\\lib\site-packages\fdb\ibase.py", line 1385, in __init__

    raise Exception("The location of Firebird Client Library could not be determined.")

Exception: The location of Firebird Client Library could not be determined.


Решение:

Создаем строковый параметр, который указан в строках немногим выше той, что указана в этой строке стека ошибки:

File "C:\python38-32\\lib\site-packages\fdb\ibase.py", line 1385, in __init__

например, "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Firebird Project\Firebird Server\Instances\DefaultInstance" с путем до программной папки Firebird, например, "C:\firebird\3.0.6.33328-0_x64\".

Создаем папку "C:\firebird\3.0.6.33328-0_x64\bin\".

Копируем туда "C:\firebird\3.0.6.33328-0_x64\bin\fbclient.dll" разрядности "x32".

четверг, 14 мая 2020 г.

Доступ к СУБД Firebird 3.0 через JSP под Tomcat

Пример доступа к БД Firebird 3.5 через JSP под Tomcat.

Чтобы научить Apache Tomcat 9 под Java 1.8 подключаться к базам Firebird 3.0, копируем из архива jaybird-4.0.0.java8.zip файлы jaybird-full-4.0.0.java8.jar, lib\antlr-runtime-4.7.2.jar, lib\connector-api-1.5.jar, lib\jna-5.5.0.jar в папку <tomcat>\lib.
Создаем web-приложение: JSP-страница, которая будет выводить содержимое таблицы "USER" из БД "c:/data/base.fdb" сервера "dbserver"
<tomcat>\webapps\test_app\index.jsp

Листинг index.jsp:
<%@page import="java.sql.*" %>
<%Class.forName("org.firebirdsql.jdbc.FBDriver"); %>
<HTML>
    <HEAD>
        <TITLE>Database access through JSP</TITLE>
    </HEAD>
    <BODY>
        <H1>Result of select query</H1>
        <%
            Connection connection = DriverManager.getConnection(
                "jdbc:firebirdsql:dbserver/3255:c:/data/base.fdb",
                "SYSDBA",
                "masterkey");
            Statement statement = connection.createStatement();
            ResultSet resultset = statement.executeQuery("select id, name from user order by id asc");
        %>
        <TABLE BORDER="1">
            <TR>
                <TH>id</TH>
                <TH>name</TH>
            </TR>
            <% while(resultset.next()){ %>
            <TR>
                <TD> <%= resultset.getString(1) %></TD>
                <TD> <%= resultset.getString(2) %></TD>
            </TR>
            <% } %>
        </TABLE>
    </BODY>
</HTML>

понедельник, 27 января 2020 г.

Скрипты бэкапа и рестора Firebird для Linux

Бэкап:
/opt/firebird/bin/gbak -user SYSDBA -password masterkey -b -v -g -Y backup_$1.log localhost/3050:`pwd`/$1 $1.FBK


Рестор:
/opt/firebird/bin/gbak -user SYSDBA -password masterkey -R -c -V -P 16384 -Y restore_$1.log $1 localhost/3050:`pwd`/R_$1.fdb

пятница, 11 октября 2019 г.

воскресенье, 4 марта 2018 г.

Firebird JDBC Encoding

При подключении к базе Firebird с помощью JDBC (jaybird-full-3.0.3.jar) появляется сообщение:
Фев 04, 2018 5:18:52 PM org.firebirdsql.logging.JulLogger warn
WARNING: WARNING: No connection character set specified (property lc_ctype, encoding, charSet or localEncoding), defaulting to character set NONE

Чтобы этого не происходило нужно:
- либо в строке подключения необходимо указывать кодировку "encoding=ISO/UTF/WIN...", например:
jdbc:firebirdsql:url:db?encoding=ISO8859_1
- либо:
Properties connInfo = new Properties();
connInfo.put("user", username);
connInfo.put("password", password);
connInfo.put("charSet", "Cp1251");
Connection db = DriverManager.getConnection(dataurl, connInfo);

понедельник, 29 января 2018 г.

Запрос для запросов

Формирует пакет SQL-запросов типа "SELECT" с фильтром по одному констрейнту (PK_PURPOSEFULGRANT) и с условием по другому констрейнту (PK_BUDGET):

Варианты попроще
(по одному констрейнту):

Для Oracle:
select 'select * from (' as STMT1 from dual union all
select
'select '''||c.table_name||'.'||cc.column_name||''' as TBLCOL, count(*) as CNT from '
||c.table_name
||' t where t.'||cc.column_name||' in (123456789) union all'
from user_constraints c
join user_cons_columns cc on cc.constraint_name = c.constraint_name
where c.r_constraint_name='PK_ESTIMATE'
union all select ') where CNT <> 0' from dual
;

Для Firebird:
/* в закомментированном блоке - отсылки к знакомым мне обозначениям из Oracle */
select 'select * from (' as STMT1 from rdb$database union all
select
/*
cc.rdb$index_name as CONSTRAINT_NAME
,trim(c.rdb$relation_name) as TABLE_NAME
,trim(cc.rdb$field_name) as COLUMN_NAME
,trim(c2c.rdb$field_name) as COLUMN_NAME2
,c.rdb$foreign_key as R_CONSTRAINT_NAME
,trim(cci.rdb$relation_name) as R_TABLE_NAME
,trim(ccs.rdb$field_name) as R_COLUMN_NAME
,trim(c.rdb$relation_name)||'.'||trim(cc.rdb$field_name) as TBL_COL
*/
'select '''||trim(c.rdb$relation_name)||'.'||trim(cc.rdb$field_name)||''' as TBL_COL, count(*) as CNT from '
||trim(c.rdb$relation_name)
||' t where t.'||trim(cc.rdb$field_name)||' in (123456789) union all' as SQLA
from rdb$indices c
join rdb$index_segments cc on cc.rdb$index_name = c.rdb$index_name
join rdb$index_segments ccs on ccs.rdb$index_name = c.rdb$foreign_key
join rdb$indices cci on cci.rdb$index_name = ccs.rdb$index_name
where
trim(c.rdb$foreign_key) = 'PK_ESTIMATE'
union all select ') where CNT<>0' from rdb$database
;


Вариант посложнее:
(по двум констрейнтам одновременно)

Для Oracle:
select 'select * from (' as STMT1 from dual union all
select
'select '''||c.table_name||'.'||cc.column_name||' ('||c2c.column_name||')'' as TBLCOL, count(*) as CNT from '
||c.table_name
||' t where t.'||cc.column_name||' is not null and exists (select null from PURPOSEFULGRANT p where p.ID=t.'||cc.column_name||' and p.BUDGET_ID<>t.'||c2c.column_name||') union all'
from user_constraints c
join user_cons_columns cc on cc.constraint_name = c.constraint_name
join user_constraints c2 on c2.table_name=c.table_name and c2.r_constraint_name='PK_BUDGET'
join user_cons_columns c2c on c2c.constraint_name = c2.constraint_name
where c.r_constraint_name='PK_PURPOSEFULGRANT'
union all select ') where CNT <> 0' from dual
;

Для Firebird:
/* в закомментированном блоке - отсылки к знакомым мне обозначениям из Oracle */
select 'select * from (' as STMT1 from rdb$database union all
select
/*
cc.rdb$index_name as CONSTRAINT_NAME
,trim(c.rdb$relation_name) as TABLE_NAME
,trim(cc.rdb$field_name) as COLUMN_NAME
,trim(c2c.rdb$field_name) as COLUMN_NAME2
,c.rdb$foreign_key as R_CONSTRAINT_NAME
,trim(cci.rdb$relation_name) as R_TABLE_NAME
,trim(ccs.rdb$field_name) as R_COLUMN_NAME
,trim(c.rdb$relation_name)||'.'||trim(cc.rdb$field_name) as TBL_COL
*/
'select '''||trim(c.rdb$relation_name)||'.'||trim(cc.rdb$field_name)||' ('||trim(c2c.rdb$field_name)||')'' as TBL_COL, count(*) as CNT from '
||trim(c.rdb$relation_name)
||' t where t.'||trim(cc.rdb$field_name)||' is not null and exists (select null from PURPOSEFULGRANT p where p.ID=t.'||trim(cc.rdb$field_name)||' and p.BUDGET_ID<>t.'||trim(c2c.rdb$field_name)||') union all' as SQLA
from rdb$indices c
join rdb$index_segments cc on cc.rdb$index_name = c.rdb$index_name
join rdb$index_segments ccs on ccs.rdb$index_name = c.rdb$foreign_key
join rdb$indices cci on cci.rdb$index_name = ccs.rdb$index_name
join rdb$indices c2 on c2.rdb$relation_name = c.rdb$relation_name and c2.rdb$foreign_key = 'PK_BUDGET'
join rdb$index_segments c2c on c2c.rdb$index_name = c2.rdb$index_name
where
trim(c.rdb$foreign_key) = 'PK_PURPOSEFULGRANT'
union all select ') where CNT<>0' from rdb$database
;

понедельник, 21 августа 2017 г.

четверг, 29 июня 2017 г.

Firebird: execute statement [пример]

--#INTERBASE
create or alter procedure arys_lpad_chk as
/* Процедура проверки наличия функции LPAD в базе: если такой функции нет, то объявляем ее */
/* Процедура создана для красоты - без нее батник, при повторном использовании, выдавал ошибку, т.к. функция объявлялась второй раз */
declare variable cnt numeric(1,0); declare variable stmt1 varchar(200); declare variable stmt2 varchar(200);
begin
    select count(*) from rdb$functions where upper(rdb$function_name) = 'LPAD' into :cnt;
    stmt1 = 'DECLARE EXTERNAL FUNCTION lpad CSTRING(255), INTEGER, CSTRING(1) RETURNS CSTRING(255) FREE_IT ENTRY_POINT ''IB_UDF_lpad'' MODULE_NAME ''ib_udf''';
    stmt2 = 'DROP EXTERNAL FUNCTION lpad';
    if(cnt=0) then
        begin
            execute statement :stmt1;
        end
    else
        begin
            execute statement :stmt2;
            execute statement :stmt1;
        end
end;
--#INTERBASE
execute procedure arys_lpad_chk
--#INTERBASE
drop procedure arys_lpad_chk

четверг, 26 января 2017 г.

"Database link" для Firebird

Пример:
execute block returns (myblob blob) as
begin
FOR EXECUTE STATEMENT 'select data from anydata'
ON EXTERNAL DATA SOURCE '127.0.0.1/3050:c:/BASE.FDB' AS USER 'SYSDBA' PASSWORD 'masterkey'
INTO :myblob
DO SUSPEND;
end

Узнал отсюда:
http://www.firebirdfaq.org/faq16/

четверг, 12 мая 2016 г.

Пример запроса, который создает запросы по констрейнту

Задача:
Найти таблицы, в которых используется пара кодов из справочника "КЦСР", а именно: 7140450641 и 7140450642.

Решение с помощью запроса, создающего подзапросы:
1) Пишем запрос, результатом которого будет один большой запрос, состоящий из множества подзапросов объединенных оператором "union all":
«
select
'select '''||c.table_name||'.'||cc.column_name||''',count(*) CNT from '
||c.table_name
||' t where t.'||cc.column_name||' in (''7140450641'', ''7140450642'') and t.BUDGET_ID=800000001309 union all'
from user_constraints c join user_cons_columns cc on cc.constraint_name = c.constraint_name where c.r_constraint_name='UQ_KCSR' and cc.column_name <> 'BUDGET_ID'
order by c.table_name,cc.column_name;
»
/* "cc.column_name <> 'BUDGET_ID'" - это условие добавлено, т.к. констрейнт "UQ_KCSR" содержит 2 колонки, в том числе и колонку "BUDGET_ID", поэтому без этого условия все подзапросы удвоятся */

2) Пример результата:
«
select 'PROTOCOL.KCSR_CODE',count(*) CNT from PROTOCOL t where t.KCSR_CODE in ('7140450641', '7140450642') and t.BUDGET_ID=800000001309 union all
select 'PURPOSEFULGRANT_EXPKBK.KCSR_CODE',count(*) CNT from PURPOSEFULGRANT_EXPKBK t where t.KCSR_CODE in ('7140450641', '7140450642') and t.BUDGET_ID=800000001309 union all
...;
»


3) Этот результат оформляем таким образом (см. первую и последнюю строки):
«
select * from (
select 'PROTOCOL.KCSR_CODE',count(*) CNT from PROTOCOL t where t.KCSR_CODE in ('7140450641', '7140450642') and t.BUDGET_ID=800000001309 union all
select 'PURPOSEFULGRANT_EXPKBK.KCSR_CODE',count(*) CNT from PURPOSEFULGRANT_EXPKBK t where t.KCSR_CODE in ('7140450641', '7140450642') and t.BUDGET_ID=800000001309 union all
...
) where CNT<>0;
»
/* "CNT<>0" - это условие добавлено, т.к. без него запрос будет показывать все таблицы, в том числе и где нужных нам записей нет */

Итог:
Решение сработало успешно, в результате запрос выдал (т.е. в таблице "PURPOSEFULGRANT_EXPKBK" есть 1 запись, содержащая искомый код КЦСР):
«
PURPOSEFULGRANT_EXPKBK.KCSR_CODE' 1
»

P.S. Запрос для запросов для Firebird:

Пример №1 (простой):
select
'select '''
||trim(i.rdb$relation_name)||'.'||trim(isg.rdb$field_name)||''' as TABLE_NAME, count(*) as CNT from '
||trim(i.rdb$relation_name)||' where '||trim(isg.rdb$field_name)||'=777 union all'
from rdb$indices i
join rdb$index_segments isg on isg.rdb$index_name = i.rdb$index_name
where i.rdb$foreign_key = 'PK_BUDGETLINE'
order by
i.rdb$relation_name
,isg.rdb$field_name;

Пример №2 (сложный):
select
'select '''
||trim(i.rdb$relation_name)||''' as TABLE_NAME, count(*) as CNT from '
||trim(i.rdb$relation_name)||' as t where t.'
||trim(isg.rdb$field_name)||'=3250000000441 and t.KCSR_CODE is not null union all'
from rdb$indices i
join rdb$index_segments isg on isg.rdb$index_name = i.rdb$index_name
where i.rdb$foreign_key = 'UQ_KCSR'
and trim(isg.rdb$field_name) = 'BUDGET_ID'
order by
i.rdb$relation_name
,isg.rdb$field_name;

четверг, 3 марта 2016 г.

Доступ к СУБД Firebird через JSP под Tomcat

Пример доступа к БД Firebird через JSP под Tomcat.

Чтобы научить tomcat подключаться к базам Firebird, копируем jaybird-full-2.2.9.jar в папку <tomcat>\lib.
Создаем web-приложение: JSP-страница, которая будет выводить содержимое таблицы "USER" из БД "c:/data/base.fdb" сервера "dbserver"
<tomcat>\webapps\test_app\index.jsp

Листинг index.jsp:
<%@page import="java.sql.*" %>
<%Class.forName("org.firebirdsql.jdbc.FBDriver"); %>
<HTML>
    <HEAD>
        <TITLE>Database access through JSP</TITLE>
    </HEAD>
    <BODY>
        <H1>Result of select query</H1>
        <%
            Connection connection = DriverManager.getConnection(
                "jdbc:firebirdsql:dbserver/3255:c:/data/base.fdb",
                "SYSDBA",
                "masterkey");
            Statement statement = connection.createStatement();
            ResultSet resultset = statement.executeQuery("select id, name from user order by id asc");
        %>
        <TABLE BORDER="1">
            <TR>
                <TH>id</TH>
                <TH>name</TH>
            </TR>
            <% while(resultset.next()){ %>
            <TR>
                <TD> <%= resultset.getString(1) %></TD>
                <TD> <%= resultset.getString(2) %></TD>
            </TR>
            <% } %>
        </TABLE>
    </BODY>
</HTML>

Полезные ссылки:
http://www.java2s.com/Tutorial/Java/0360__JSP/MakeDatabaseconnection.htm
http://jaybirdwiki.firebirdsql.org/jaybird/doku.php?id=config:driver_config

Проработать:
http://www.tutorialspoint.com/jsp/jsp_database_access.htm

пятница, 28 ноября 2014 г.

пятница, 15 июня 2012 г.

(черновик) Установка Firebird на Oracle Enterprise Linux x64 5.5

(Это черновой вариант инструкции, т.к. нет опыта запуска СУБД на Linux)

1. Скачать и установить RPM-дистрибутив для Linux AMD64: http://firebirdsql.org/en/firebird-2-5/#Linux_AMD64;

2. Сменить пароль для пользователя SYSDBA (для удобства): http://beepings.blogspot.com/2012/06/firebird-sysdba-linux.html;

3. Номер порта службы можно изменить (при необходимости): в файле
/opt/firebird/firebird.conf
параметр
RemoteServicePort

4. Запуск Firebird: можно выполнить файл
/opt/firebird/bin/fbguard
(но я не уверен, что это правильный вариант, поэтому данное решение будет пересмотрено после ознакомления с литературой)

Firebird: пароль для SYSDBA (для Linux)

После установки пароль см. в файле /opt/firebird/SYSDBA.password.
Изменить можно с помощью changeDBAPassword.sh

Архив