Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» InterBase и FireBird: вопросы по работе и их решение

Автор: miwa
Дата сообщения: 19.09.2012 19:31
Maximus777
В таком случае я так и не понял - а чем мой запрос с предыдущей страницы не угодил?
Автор: Maximus777
Дата сообщения: 19.09.2012 20:10
miwa
в принципе, угодил. Хотя почему-то работает через раз. То шкнит про дубли, то отрабатывает норм.
Автор: miwa
Дата сообщения: 19.09.2012 23:18
Maximus777
Вот и первый звоночек из обещанной череды неприятных неожиданностей

Добавлено:
Maximus777
А, впрочем, покажите код тригера, который работает через раз. Возможно, вы что-то перемудрили.
Автор: eddoc
Дата сообщения: 20.09.2012 09:57
Maximus777

Цитата:
А теперь можно кусочек кода?

Вчитываться в тот бред, который вы пытаетесь воплотить в код? Увольте ...
Автор: Maximus777
Дата сообщения: 20.09.2012 15:00
miwa
Цитата:
Вот и первый звоночек из обещанной череды неприятных неожиданностей

Этот звоночек явно вытекает из технологии перебора значений в базе. Т.е. выборка идёт не совсем в той последовательности, в которой добавлялись строки в таблицу. Но и в этом факте нет никакой катастрофы. Хотя мысль о создании интерфейса удаления для прользователей мне уже не кажется лишней ... Особенно, если в другую табличку складывать историю действий пользователей.


Цитата:
А, впрочем, покажите код тригера, который работает через раз. Возможно, вы что-то перемудрили.

Ничего вообще не мудрил. И триггеры ещё не научился создавать. Запрос был такой:

Код: update client_catalog set item_id = item_id - 1 where item_id > 240
Автор: miwa
Дата сообщения: 20.09.2012 15:17
Maximus777

Цитата:
Этот звоночек явно вытекает из технологии перебора значений в базе. Т.е. выборка идёт не совсем в той последовательности, в которой добавлялись строки в таблицу.

Естесствено, это же реляционная СУБД. Признайтесь честно - вы даже не смотрели предложенные вам материалы, а если смотрели, ничего не поняли.

В любом случае, вы сами выбрали свой путь; будем надеятся, что падение с обрыва, о котором тут все предупреждают, будет не слишком болезненным и не отобъет почки желания продолжать учиться.
Автор: jonikDk
Дата сообщения: 20.09.2012 15:52

Цитата:
Хотя мысль о создании интерфейса удаления для прользователей мне уже не кажется лишней ... Особенно, если в другую табличку складывать историю действий пользователей.

вот так неизвестно чья народная забава - бег по граблям, дает положительную динамику, глядишь скоро и результаты будут положительными.
Если не трудно, хотелось бы, чтобы Вы отписались о реализации своей программы, через несколько недель.
Автор: Maximus777
Дата сообщения: 20.09.2012 15:59
miwa
Цитата:
Признайтесь честно - вы даже не смотрели предложенные вам материалы, а если смотрели, ничего не поняли.

Так точно, книгу ещё даже не скачал, а сайт с примерами процедил, но к решению моей задачи меня это не приблизило.

jonikDk
Цитата:
Если не трудно, хотелось бы, чтобы Вы отписались о реализации своей программы, через несколько недель.

Если я всё же смогу сподобить задуманный триггер, то отпишусь обязательно. А пока довольствуюсь ручным запуском процедуры, о которой рассказал на предыдущей странице.
Автор: miwa
Дата сообщения: 20.09.2012 21:43
Maximus777

Цитата:
сайт с примерами процедил, но к решению моей задачи меня это не приблизило

//Поперхнулся чаем
«Сайт с примерами» надо полгода проходить-изучать, вообще-то. Желательно по нескольку раз каждый пример. Кроме самых начальных, конечно.

Да и с книгой - тоже зря. За это время ее можно было как минимум просмотреть, а некоторые главы даже внимательно прочитать и попробовать осмыслить. Толку было бы значительно больше, чем читать, что пишут неизвесные люди под непонятными никами на форуме
Автор: eddoc
Дата сообщения: 21.09.2012 14:53
miwa
про бисер слыхали пословицу?
Автор: Maximus777
Дата сообщения: 22.09.2012 16:13
eddoc
Вы же вроде уволились ... Что же Вас заставляет оставлять такие гнилые комменты?
Автор: golkanavt
Дата сообщения: 24.09.2012 10:06
Всем привет. Под Firebird 2.5 x86 версия AUDFL rfunc нормально работает, кто использует? На боевом сервере 2.1 х86 с древней оригинальной пашет нормально. Сделал тестовый сервер, под 2.5 при наличии старой библиотеке попытки использования функций выдают:

Цитата:
invalid request BLR at offset 59.
function EXTRACTDATE is not defined.
module name or entrypoint could not be found


При замене на AUDFL часть функций работает нормально, часть - валит сервер наглухо, например datetostr.
ЧЯДНТ?
Автор: miwa
Дата сообщения: 24.09.2012 10:28
golkanavt
В 2.5 (да и в 2.1 тоже) появилось очень много встроенных функций для работы и с датой, и со строками и с прочей математикой. А с другой стороны сам rfunc не обновляется уже лет восемь, наверное. Так что лично я бы смотрел на предмет полного отказа от использования этой довольно-таки приличной, но уже весьма устаревшей и неподдерживаемой библиотеки. Конкретно по функциям даты-времени - dateadd, datediff, extract позволяют решить довольно широкий круг задач.
Автор: golkanavt
Дата сообщения: 24.09.2012 11:00
miwa
Спасибо за совет, но не надо. Проект боевой, и ему без малого 10 лет в производстве. Перекраивать всю структуру базы под встроенные функции, без малого под 200 таблиц и 500 хранимок - не выход. Постепенно это возможно, но процесс растянется на месяцы в любом случае. У rfunc есть мод AUDFL (https://www.assembla.com/wiki/show/audfl_rfunc), о котором и идет речь в моем посте - это живой проект.
Автор: ant0ni02004
Дата сообщения: 24.09.2012 14:39
golkanavt
а проверьте, вдруг ему (rfunc-у) на новом сервере не хватает каких-нибудь системных dll-ок типа msvcrt, msvcp итд от пред.версий винды (вы их можете скопировать из System32 работающего сервера)
Автор: miwa
Дата сообщения: 24.09.2012 16:16
golkanavt
В таком случае +1 к отстутствию нужной библиотеки или ее зависимостей. Для линукса - комманда ldd <filename> покажет список всех библиотек, которые ей нужны; для виндовса - не знаю, но уверен что тоже есть соответствующая программа. С ходу самые вероятные отсутствующие кандидаты - msvc* и icu*.

Это все касаемо rfunc; насчет AUDFL - а что в логах сервера при попытках вызова неработающих функций? И что значит "валит наглухо"? Подключиться с другой консоли/другой программы получается? С другого компьютера?
Автор: ant0ni02004
Дата сообщения: 24.09.2012 18:16
golkanavt
что еще может быть - права на запись в папку Firebird. всякие там "создатель владелец" итд
Автор: golkanavt
Дата сообщения: 24.09.2012 20:30
miwa
ant0ni02004
Спасибо за участие. Библиотеки все на месте, конфиги идентичны - сношу Fb 2.5, ставлю 2.1 - все работает. Обратное действие - как и сказано выше, валит коннект, а не сервер - уточняю, сначала казалось что сервак полностью валится, но нет, только коннект. В логах только это:

Цитата:

INET/inet_error: connect errno = 10061
INET/inet_error: read errno = 10054


Экспериментирую дальше.
Автор: miwa
Дата сообщения: 24.09.2012 21:06
golkanavt
Это уже предметнее.

Какой вариант ФБ 2.5 стоит - классик, супер, суперклассик? Особо рекомендую дважды, а лучше трижды перепроверить разрядность всего используемого хозяйства - ОС, ФБ, всех библиотек (особенно AUDFL): все должно быть одной разрядности.
Автор: ant0ni02004
Дата сообщения: 25.09.2012 02:06
golkanavt
ну смотрите,
10054 = Connection reset by peer
10061 = Connection refused
может быть это фаервол не пускает
без удф запросы хоть проходят?
Автор: exteris
Дата сообщения: 25.09.2012 07:34
golkanavt
Попробуйте положить рядом fbclient.dll c именем gds32.dll

Добавлено:
Хотя, FB 2.1 тогда бы тоже не работала
Автор: jonikDk
Дата сообщения: 25.09.2012 09:16
golkanavt
Вы на sql.ru не спрашивали? Там разработчики Firebird наверняка бы подсказали в каком направлении копать
Автор: golkanavt
Дата сообщения: 25.09.2012 13:31
exteris
Да уже разные комбинации пробовал, суть не меняется.
jonikDk
Еще нет, т.к. пока что переход на 2.5 отложен, буду теперь в фоновом режиме разбираться. Без SQL.RU не обойтись, с этим переходом еще один косяк вылез - бэкап под 2.5 не ресторится без ключей FIX_ESS_DATA/METADATA, хотя ранее база уже проходила через конвертацию 1.5->2.1 с исправлением метаданных, тогда вволю оттоптался на граблях. И помимо всего, после рестора с ключами слетают все русские описания объектов, так что теперь плясок с бубном мне хватит надолго.

Добавлено:

Цитата:
Какой вариант ФБ 2.5 стоит - классик, супер, суперклассик? Особо рекомендую дважды, а лучше трижды перепроверить разрядность всего используемого хозяйства - ОС, ФБ, всех библиотек (особенно AUDFL): все должно быть одной разрядности.

Ставил супер, все хозяйство х86
Автор: miwa
Дата сообщения: 25.09.2012 18:57
golkanavt
fix_fss_metadata - обязательный ЕДИНОРАЗОВЫЙ процесс при переходе с 2.1 на 2.5 из-за того, что в 2.5 вся внутренняя кухня в юникоде.
При чем этот ключ появился только в 2.5, так что при переходе с 1.5 на 2.1 вы что-то другое исправляли.

P.S. Я так и не понял, зависимости для audfl, или как там ее - вы проверяли?
Автор: golkanavt
Дата сообщения: 26.09.2012 12:39

Цитата:
fix_fss_metadata - обязательный ЕДИНОРАЗОВЫЙ процесс при переходе с 2.1 на 2.5 из-за того, что в 2.5 вся внутренняя кухня в юникоде.
При чем этот ключ появился только в 2.5, так что при переходе с 1.5 на 2.1 вы что-то другое исправляли.

В 2.1 внутренности тоже в юникоде, именно поэтому в релизноте сказано о конвертации базы посредством процедуры rdb$check_metadata/rdb$fix_metadata('WIN1251'), а в 2.5 этот функционал загнали в ключи, суть осталась та же. То есть по идее, после перехода на 2.1 в дальнейшем при переходе на 2.5 все метаданные уже должны быть пофиксены и не требовать использования этих ключей при ресторе.
Зависимости не проверял, т.к. как было сказано ранее - на той же машине с теми же конфигами но под 2.1 все работает как часы. Да и отложен сейчас этот вопрос с переходом на 2.5, есть другие задачи. Возможно на след. неделе к нему вернусь и отпишусь о результатах.
Автор: miwa
Дата сообщения: 26.09.2012 14:50
golkanavt
Не флейма ради, но истины для.

Опция fix_fss_metadata в gbak появилась ТОЛЬКО в ФБ 2.5 как обязательный одноразовый ключ при переводе баз данных с более старых версий в случае, если в метаданных были неанглийские символы (в том числе кириллица). В 2.1 ее не было.

В качестве подтверджения - ссылки на релизноты 2.1 (никаких упоминаний об fix_fss_metadata) и 2.5 (упоминания есть), а также тикет в трекере ФБ, в котором реализован соответствующий функционал. Советую обратить внимания на строчку "Fix versions".
Добавлено:
Не люблю исправлять задним числом ошибочные посты, но свои ошибки надо исправлять

Да, вспомнил, при переходе на 2.1 была процедура, которая фиксила метаданные в базе. Тоесть, функционал в gbak появился только в 2.5, но проблема была еще при переходе на 2.1 и решалась процедурой, которая исправляла кодировку метаданных правкой системных таблиц. А в 2.5 уже появился ключ в gbak. Прошу извинить, если ввел в заблуждение.


Цитата:
Зависимости не проверял, т.к. как было сказано ранее - на той же машине с теми же конфигами но под 2.1 все работает как часы.

Я правильно понимаю, что под 2.1 вы используете оригинальную УДФ, а под 2.5 - переделанную?

Кроме того, "с теме же конфигами" не значит "с теми же версиями системных библиотек". Особенно это касается микрософтовских рантаймов и всяких icu*.dll.


Цитата:
Да и отложен сейчас этот вопрос с переходом на 2.5, есть другие задачи. Возможно на след. неделе к нему вернусь и отпишусь о результатах.

Было бы неплохо - интересно, чем все закончится
Автор: SergKhM
Дата сообщения: 26.09.2012 18:56
golkanavt

буквально сегодня возникла ситуация - перехожу у клиента с 1.5 на 2.5. Соединение клиента с сервером - Ок, но при попытке соединится с БД - отказ. Дело оказалось в заброшенном Internet security касперского.
Реально приложение не запускалось, но драйвера стояли и вредили.

Может и у Вас что-то подобное в фоне?
Автор: eddoc
Дата сообщения: 27.09.2012 18:52
miwa

Цитата:
решалась процедурой, которая исправляла кодировку метаданных правкой системных таблиц.

ткни, плз, таблю и поле
Автор: miwa
Дата сообщения: 27.09.2012 19:35
eddoc
Их там дофига Я лучше скопипастю сюда саму процедуру


Код:
set term !;

create or alter procedure rdb$fix_metadata
(charset varchar(31) character set ascii)
returns
(table_name char(31) character set unicode_fss,
field_name char(31) character set unicode_fss,
name1 char(31) character set unicode_fss,
name2 char(31) character set unicode_fss)
as
declare variable system integer;
declare variable field1 char(31) character set unicode_fss;
declare variable field2 char(31) character set unicode_fss;
declare variable has_records integer;
begin
for select rf.rdb$relation_name, rf.rdb$field_name,
(select 1 from rdb$relation_fields
where rdb$relation_name = rf.rdb$relation_name and
rdb$field_name = 'RDB$SYSTEM_FLAG'),
case rdb$relation_name
when 'RDB$CHARACTER_SETS' then 'RDB$CHARACTER_SET_NAME'
when 'RDB$COLLATIONS' then 'RDB$COLLATION_NAME'
when 'RDB$EXCEPTIONS' then 'RDB$EXCEPTION_NAME'
when 'RDB$FIELDS' then 'RDB$FIELD_NAME'
when 'RDB$FILTERS' then 'RDB$INPUT_SUB_TYPE'
when 'RDB$FUNCTIONS' then 'RDB$FUNCTION_NAME'
when 'RDB$GENERATORS' then 'RDB$GENERATOR_NAME'
when 'RDB$INDICES' then 'RDB$INDEX_NAME'
when 'RDB$PROCEDURES' then 'RDB$PROCEDURE_NAME'
when 'RDB$PROCEDURE_PARAMETERS' then 'RDB$PROCEDURE_NAME'
when 'RDB$RELATIONS' then 'RDB$RELATION_NAME'
when 'RDB$RELATION_FIELDS' then 'RDB$RELATION_NAME'
when 'RDB$ROLES' then 'RDB$ROLE_NAME'
when 'RDB$TRIGGERS' then 'RDB$TRIGGER_NAME'
else NULL
end,
case rdb$relation_name
when 'RDB$FILTERS' then 'RDB$OUTPUT_SUB_TYPE'
when 'RDB$PROCEDURE_PARAMETERS' then 'RDB$PARAMETER_NAME'
when 'RDB$RELATION_FIELDS' then 'RDB$FIELD_NAME'
else NULL
end
from rdb$relation_fields rf
join rdb$fields f
on (rf.rdb$field_source = f.rdb$field_name)
where f.rdb$field_type = 261 and f.rdb$field_sub_type = 1 and
f.rdb$field_name <> 'RDB$SPECIFIC_ATTRIBUTES' and
rf.rdb$relation_name starting with 'RDB$'
order by rf.rdb$relation_name
into :table_name, :field_name, :system, :field1, :field2
do
begin
name1 = null;
name2 = null;

if (field1 is null and field2 is null) then
begin
has_records = null;

execute statement
'select first 1 1 from ' || table_name ||
' where ' || field_name || ' is not null' ||
iif(system = 1, ' and coalesce(rdb$system_flag, 0) in (0, 3)', '')
into :has_records;

if (has_records = 1) then
begin
suspend;

execute statement
'update ' || table_name || ' set ' || field_name || ' = ' ||
' cast(cast(' || field_name || ' as blob sub_type text character set none) as ' ||
' blob sub_type text character set ' || charset || ') ' ||
iif(system = 1, 'where coalesce(rdb$system_flag, 0) in (0, 3)', '');
end
end
else
begin
for execute statement
'select ' || field1 || ', ' || coalesce(field2, ' null') || ' from ' || table_name ||
' where ' || field_name || ' is not null' ||
iif(system = 1, ' and coalesce(rdb$system_flag, 0) in (0, 3)', '')
into :name1, :name2
do
begin
suspend;

execute statement
'update ' || table_name || ' set ' || field_name || ' = ' ||
' cast(cast(' || field_name || ' as blob sub_type text character set none) as ' ||
' blob sub_type text character set ' || charset || ') ' ||
' where ' || field1 || ' = ''' || name1 || '''' ||
iif(name2 is null, '', ' and ' || field2 || ' = ''' || name2 || '''');
end
end
end
end!

commit!

set term ;!
Автор: NikRON
Дата сообщения: 28.09.2012 10:17
golkanavt
воспользуйся IBExpert'ом для переноса БД в Firebird 2.5..
не забудь при создании бэкапа выставить формат "Transportable", а при восстановление выставить поля, начинающиеся на "Fix mailformed UNICODE_FSS..."

у меня без проблем БД из Firebird 1.5 в Firebird 2.5 конвертнулась..

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465

Предыдущая тема: Сравнение двух строк


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.