Словами клиента глаголит истина: "Тут вот настоятельно рекомендовали обновить версию базы... ну попробовал. Результаты в виде журнала Постгресса и трассировки ODBC прилагаются в архиве. Естественно ничего не обновилось."
Created attachment 564 [details] ODBC-SQL.LOG
Created attachment 565 [details] postgresql-2008-07-09.log
Ошибка критичная и решить ее надо как можно быстрее.
В качестве временного решения можно предложить либо - выгрузить базу и загрузить её заново. либо - вручную запустить Scripts/selta_up_102_to_103.sql из каталога Selta для обновления.
В утилите обновления невнятная диагностика. Вот выдержка из лога: Selta 848-468 EXIT SQLExecDirect with return code -1 (SQL_ERROR) HSTMT 00A22A08 UCHAR * 0x00222EFC [ -3] "!!-- Update SELTA@Etersoft v.1.0.2 to SELTA@Etersoft v.1.0.3 (102 to 103)\ a\ adrop table if exists pg_selta_version;\ acreate table pg_selta_version(num int, ver mvarchar);\ ainsert into pg_selta_version values (103, 'SELTA@Etersoft v.1.0.3');\ a\ a-- Remove all procedure from 1C\ aselect drop_function(name) from pg_func_names;\ a\ a\ 0" SDWORD -3 DIAG [HY000] internal RELEASE failed; ERROR: cannot EXECUTE a null querystring (8) Как раз тут расшифровывается ошибка 8. Сейчас попробую собрать новую сборку.
Created attachment 566 [details] Исправленный файл обновления Пока нет новой сборки selta.msi файл selta_up_102_to_103.sql нужно положить в C:\Program Files\Selta\Scripts
Created attachment 577 [details] корректный вариант от клиента подробности в заявке 7319
"В файле, который я прислал как вариант решения, и я об этом писал, была хранимая процедура, подправленная мной на скорую руку. Я банально удалил строчку подчищающую таблицу pg_func_names. Это не есть правильно. Вечером того же дня я пересоздал процедуру и почистил эту таблицу от накопившегося мусора. Что касаемо обновления, то там надо либо в конце поставить повторное объявление процедуры с недостающей строчкой, либо создать временную табличку, куда "слить" названия очищаемых процедур, по ней произвести зачистку стандартной процедурой и затем удалить её. Можно конечно и с блокировками повозиться, но это уже думаю здесь избыточно. А вот процедуру пересоздавать придётся в любом варианте ибо без "IF EXISTS" оно работает хреново, ведь в таблице pg_func_names элементарно может быть мусор!"
Короче, разберитесь пожалуйста, каким должен быть скрипт для обновления. Чтобы он корректно удалял то, что нам нужно, не мусорил и вообще работал.
(In reply to comment #9) > Короче, разберитесь пожалуйста, каким > должен быть скрипт для обновления. > Чтобы он корректно удалял то, что нам нужно, > не мусорил и вообще работал. > хотелось бы узнать - или кому задавать вопросы типа "что для чего нужно и где лежит" ??
в скрипте от клиента 1. строчка 'DROP FUNCTION IF EXISTS ' проверяет на наличие функций для удаления 2. последняя строчка полностью чистит таблицу pg_func_names ошибка возникнет тогда, когда описанная DROP_FUNCTION будет использоваться вне скрипта и без последующего удаления записи о ф-ции в pg_func_names, удаленной с помощью DROP FUNCTION. в этом случае в pg_func_names будем иметь запись о несуществующей функции, что не есть хорошо отсюда вопрос: DROP_FUNCTION используется только в скрипте или вне его тоже?
в скрипте от клиента 1. строчка 'DROP FUNCTION IF EXISTS ' проверяет на наличие функций для удаления 2. последняя строчка полностью чистит таблицу pg_func_names ошибка возникнет тогда, когда описанная DROP_FUNCTION будет использоваться вне скрипта и без последующего удаления записи о ф-ции в pg_func_names, удаленной с помощью DROP_FUNCTION. в этом случае в pg_func_names будем иметь запись о несуществующей функции, что не есть хорошо отсюда вопрос: DROP_FUNCTION используется только в скрипте или вне его тоже?
странно что первый вариант скрипта у клиента не сработал(attachment id=566), у меня все заработало (проверял команды в скрипте "вручную" консолью, постгри на тестинге) отсюда оправданным видится только добавление "IF EXISTS"
правильным решением будет объединить оба варианта + all_name проверять на NULL
Created attachment 590 [details] предварительный исправленный вариант нужно протестить
(In reply to comment #15) > Created an attachment (id=590) [details] > предварительный исправленный вариант (заявка 6507) возможно еще нужно добавить индексы в таблицу pg_func_names, первичный ключ по полю name
Created attachment 591 [details] добавлен первычный ключ осталось протестить на работоспособность
(In reply to comment #17) > добавлен первычный ключ > осталось протестить на работоспособность работает, можно включать в сборку
1. Юра, сейчас функция DELETE_FUNCTION из файла обновления до 1.0.3 отличается от функции в selta_install.sql. Надо определиться, где правильнее. 2. Бага по первичному ключу должна быть отдельно, и исправление должно входить не только в файл обновления, но и в selta_install.sql, который задействуется при инициализации базы.
(In reply to comment #19) > 1. Юра, сейчас функция DELETE_FUNCTION из файла > обновления до 1.0.3 отличается от функции в > selta_install.sql. Надо определиться, где > правильнее. правильным будет второй вариант > 2. Бага по первичному ключу должна быть > отдельно, и исправление должно входить не > только в файл обновления, но и в selta_install.sql, > который задействуется при инициализации > базы. > создал, бага 2171
> правильным будет второй вариант имеется ввиду вариант функции DROP_FUNCTION из комментария #17
(In reply to comment #21) > > правильным будет второй вариант > > имеется ввиду вариант функции DROP_FUNCTION > из комментария #17 > этот же вариант функции должен быть и в selta_install.sql ?
Ну всё, всё необходимое для обновления внесено в 1.0.4