Основы обновления конфигурации программного продукта Террасофт
В данном блоге приведу список часто возникающих проблем и способов их решения.
1. Версия приложения и базы данных несовместимы.
---------------------------
Error
---------------------------
Невозможно установить соединение с конфигурацией 'NameDB'.
Версия приложения и базы данных несовместимы
---------------------------
OK
---------------------------
Данное сообщение Вы можете увидеть как при запуске Администратора Террасофт, так и при попытке применения пакета разницы.
Для решения этой проблемы необходимо убедиться, что используемые бинарные файлы соответствуют конфигурации Террасофт.
Для этого необходимо:
1. Найти запускаемый файл TSAdmin.exe, правой кнопкой мышки вызвать контекстное меню и выбрать «Свойства», перейти на закладку «Версия» и посмотреть на данные в строке «Версия о файле».
2. Запустить утилиту управления БД (Enterprise Manager, SQL Server Management Studio) выбрать ту конфигурацию Террасофт, на которую выполняется обновление и выполнить следующий запрос:
Результатом этого запроса будет номер версии продукта, релиза и конфигурации.
И уже в зависимости от результата необходимо использовать другие бинарные файлы или настроить соединение на другую конфигурацию.
Если сообщение возникло при попытке применения пакета разницы, тогда необходимо выполнить описанный выше пункт 2 для конфигурации, которая обновляется.
Случались прецеденты, когда пакет разницы применялся для конфигурации на которую выполняется обновление, а не на конфигурации, которая должна быть обновлена.
Например:
Вы выполняете обновление с версии 3.1.1.56 на версию 3.2.0.55.
В данном случае конфигурация, которая обновляется — 3.1.1.56, а конфигурации на которую выполняется обновление — 3.2.0.55.
2. При применения пакета разницы возникает лог:
[color=red]Лицензия для модуля 'Custom' не найдена,
Лицензия для модуля 'Common' не найдена.
... ... ...[/color]
Обновление придется выполнять заново.
Прежде всего, рекомендую проверить отключено ли кэширование на уровне БД и очищен ли текущий кэш.
В полях [Пользователь] и [Пароль] (окна применения пакета) необходимо ввести sa (или имя пользователя являющимся стандартным системным администратором под Вашу СУБД) и его пароль.
Лицензию на этого пользователя заказывать не нужно.
После выполнение обновления Вы сможете подключиться к конфигурации под пользователем sa.
P.S. Проблема наблюдается при обновления конфигурации, начиная с версии 3.1.1. на MS SQL Server 2005 Express.
3. Если при пересохранении таблиц возникают следующие ошибки:
[color=red](E) Invalid object name 'dbo.tbl_TableName'. «Call Stack»
(E) Could not create constraint. See previous errors. Foreign key 'ForeignKeyName' references invalid table 'dbo.tbl_TableName'. «Call Stack»[/color]
[color=red](E) Error to save service: tbl_TableName'
Original message: При сохранении объекта 'Solutions\Details\Groups\tbl_TableName' в базу данных, возникла ошибка: Invalid object name 'dbo.tbl_TableName'[/color]
1. Удалить все внешние ключи;
Для этого в конфигурации необходимо создать следующий скрипт (и подключить scr_db):
// scr_DeleteAllForeignKeys function Main() { Log.Write(1, 'Start.'); var Service; var SelectQuery = Services.GetNewItemByUSI('sq_Service'); ApplySelectQueryFilter(SelectQuery, 'ServiceTypeCode', 'Table', true); var Dataset = SelectQuery.Open(); var i = 0; var Code; Dataset.GotoFirst(); while (!Dataset.IsEOF) { Code = Dataset.ValAsStr('Code'); i++; try { Service = Services.GetSingleItemByUSI(Code); Service.Relations.Clear(); Services.SaveItem(Service, 1); Log.Write(1, i + '. Service ' + Code + ' saved.'); } catch(e) { Log.Write(2, i + '. Error to save service: ' + Code + ' Original message: ' + e.message); } System.ProcessMessages(); Dataset.GotoNext(); } Dataset.Close(); Log.Write(1, 'Finish.'); }
2. Пересохранить таблицы;
3. Загрузить сервисы таблиц из коробочной конфигурации;
4. Пересохранить таблицы.
Таблицы не сохранившиеся автоматически необходимо сохранять вручную.
4. [color=red]The statement has been terminated. Cannot insert duplicate key row in object 'dbo.tbl_Service' with unique index 'UIServiceCode'[/color]
[color=red]Выполнение данной инструкции было прервано. Невозможно вставить повторяющуюся ключевую строку в объект "dbo.tbl_Service" с уникальным индексом "UIServiceCode"[/color]
Данная проблема может появиться при выполнении обновления с 3.3.0 на 3.3.1.
Дело в том, что при применении пакета разницы проверяется на уникальность как ID сервиса, так и его code.
Поэтому если в конфигурации был переименован и сохранен какой-либо сервис, а после этого был создан еще один сервис, с изначальным именем переименованного сервиса, возникает описанная проблема.
Для решения этой проблемы необходимо выполнить скрипт "Generation.5.Repair IDs.sql" (во вложении прилагаю архив с этим скриптом).
В скрипте «Generation.5.Repair IDs.sql» необходимо внести следующие изменения:
-- [_33140_SD_Rus] заменить на название коробочной (пустой) БД версии 3.3.1.
-- [_33024_SD_Rus] заменить на название Вашей БД версии 3.3.0.
Результатом выполнения скрипта будет блок sql, который необходимо заменить в основном sql-файле (файл называется MSSQL.sql и находится в папке SQL).
Необходимо открыть его на изменение и в блоке: "UpdateServiceID" заменить имеющийся блок на сформированный.
Дополнительно хочу заметить, что если после выполнения «применителя» не будут открываться и изменяться сервисы: sq_* или wnd_*, то их необходимо заменить на сервисы из коробочной версии.
5. После выполнения обновления в некоторых разделах не отображаются статические и динамические группы.
Изначально рекомендуется убедиться, что группы перенеслись.
Для этого необходимо выбрать корневую группу и вызвав контекстное меню нажать на пункт "Отобразить группы всех пользователей".
Если группы присутствуют, тогда рекомендуется загрузить сервис "scr_Groups" из коробочной версии.
Если же групп нет, тогда необходимо тщательно анализировать лог-файл сформировавшийся в процессе выполнения обновления.
'The statement has been terminated. Cannot insert duplicate key row in object 'dbo.tbl_Service' with unique index 'UIServiceCode'
"Присяжнюк Владимир" написал:Generation.5.Repair IDs.sql
Если у пользователя на сервере стоит другая кодировка, отличная от кодировки баз Terrasoft
то скрипт будет терпеть неудачу, правильнее прописать в скрипте явно указав кодировку сравнения при создании временной таблицы а именно заменив строки:
create table #tmpCodes ( Code nvarchar(250)) на create table #tmpCodes ( Code nvarchar(250) collate Cyrillic_General_CI_AS)
где Cyrillic_General_CI_AS - кодировка используемая в базе продуктов Terrasoft
так как временная таблица иначе создастся в кодировке сравнения по умолчанию заданной
на сервере.
Большое спасибо за решение третьей ошибки! Помогло!
Только сам по себе скрипт не отработал, добавила одну строчку:
Service.Relations.Clear();
в существующий скрипт пересохранения таблиц - scr_ResaveTables.
Таким образом пользовалась данным скриптом в двух вариантах:
- удаление всех внешних ключей;
- пересохранение таблиц.
По поводу ошибки №3:
т.е. решение в том, что нужно удалить Relations у всех таблиц? Так если они там заведены значит они там нужны, не так ли? Да и зачем трогать ВСЕ таблицы, когда нужно исправить только одну?