Основы обновления конфигурации программного продукта Террасофт

В данном блоге приведу список часто возникающих проблем и способов их решения.

1. Версия приложения и базы данных несовместимы.
---------------------------
Error
---------------------------
Невозможно установить соединение с конфигурацией 'NameDB'.
Версия приложения и базы данных несовместимы
---------------------------
OK
---------------------------

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

1. Найти запускаемый файл TSAdmin.exe, правой кнопкой мышки вызвать контекстное меню и выбрать «Свойства», перейти на закладку «Версия» и посмотреть на данные в строке «Версия о файле».

2. Запустить утилиту управления БД (Enterprise Manager, SQL Server Management Studio) выбрать ту конфигурацию Террасофт, на которую выполняется обновление и выполнить следующий запрос:

SELECT DatabaseMajorVersion, DatabaseMinorVersion, DatabaseReleaseVersion FROM tbl_databaseinfo

Результатом этого запроса будет номер версии продукта, релиза и конфигурации.
И уже в зависимости от результата необходимо использовать другие бинарные файлы или настроить соединение на другую конфигурацию.

Если сообщение возникло при попытке применения пакета разницы, тогда необходимо выполнить описанный выше пункт 2 для конфигурации, которая обновляется.

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

Например:
Вы выполняете обновление с версии 3.1.1.56 на версию 3.2.0.55.
В данном случае конфигурация, которая обновляется — 3.1.1.56, а конфигурации на которую выполняется обновление — 3.2.0.55.

Нравится

Поделиться

7 комментариев

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 у всех таблиц? Так если они там заведены значит они там нужны, не так ли? Да и зачем трогать ВСЕ таблицы, когда нужно исправить только одну?

Показать все комментарии