Коллеги, у кого был опыт, поделитесь лучшими практиками.
Есть bpm'online CRM 7.3, которая автоматически на 7.4 (и далее) не переводится. Техподдержка предложила сделать всё руками на новой системе (что технически возможно).
Но появляется другой вопрос - как переносить данные? Через Excel довольно сложно будет, учитывая, что надо перенести настройки прав, пользователей, системные настройки, прикрепленные файлы и т.п.
Возможно, в мире существует набор SQL-скриптов, которые делают это для базовой конфигурации (для измененной уже допишем)?
Заранее спасибо за варианты решения
Нравится
Добрый день.
Есть пользовательский скрипт, предназначенный для переноса данных. Скрипт идет по списку таблиц, указанных пользователем, проверяет соответствие полей в таблицах обеих БД, формирует запрос и выполняет его:
begin transaction declare @syncTablesNames TABLE (TableName varchar(50)); declare @sourceDBName varchar(50), @tableName varchar(50), @columnName varchar(50), @sourceColumnExists bit, @insertSQLText nvarchar(MAX), @selectSQLText nvarchar(MAX), @columnExistsSQLText nvarchar(MAX), @idExistsCondition nvarchar(MAX), @resultSQLText nvarchar(MAX); SET @sourceDBName = 'SourceDataBaseName'; -- set tables names INSERT INTO @syncTablesNames SELECT 'tbl_Contact' UNION SELECT 'tbl_Account'; declare tableNameCursor cursor LOCAL FAST_FORWARD FOR SELECT * FROM @syncTablesNames; open tableNameCursor; fetch next FROM tableNameCursor INTO @tableName WHILE (@@fetch_status = 0) BEGIN SET @insertSQLText = 'insert into ' + @tableName + '('; SET @selectSQLText = 'select '; SET @idExistsCondition = ' where not ID in (select ID from ' + @tableName + ');'; --Disable Table Constraint exec ('alter table ' + @tableName + ' nocheck constraint all; '); declare columnNameCursor cursor LOCAL FAST_FORWARD FOR SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME = @tableName; open columnNameCursor; fetch next FROM columnNameCursor INTO @columnName; while (@@fetch_status = 0) begin SET @columnExistsSQLText = 'if exists (select COLUMN_NAME ' + 'from ' + @sourceDBName + '.information_schema.columns ' + 'where TABLE_NAME = ''' + @tableName + ''' AND ' + 'COLUMN_NAME = ''' + @columnName + ''') ' + 'set @sourceColumnExists = 1 ' + 'else ' + 'set @sourceColumnExists = 0 '; --check remote table column exists exec sp_executesql @columnExistsSQLText, N'@sourceColumnExists bit out', @sourceColumnExists = @sourceColumnExists output --include column into select-insert statment IF (@sourceColumnExists = 1) begin SET @insertSQLText = @insertSQLText + @columnName + ', '; SET @selectSQLText = @selectSQLText + @columnName + ', '; end; fetch next FROM columnNameCursor INTO @columnName; end; close columnNameCursor; deallocate columnNameCursor; SET @insertSQLText = substring(@insertSQLText, 1, len(@insertSQLText) - 2); SET @selectSQLText = substring(@selectSQLText, 1, len(@selectSQLText) - 2); SET @insertSQLText = @insertSQLText + ') '; SET @selectSQLText = @selectSQLText + ' from ' + @sourceDBName + '.dbo.' + @tableName + @idExistsCondition; --result select-insert statment SET @resultSQLText = @insertSQLText + @selectSQLText; exec (@resultSQLText); fetch next FROM tableNameCursor INTO @tableName END; close tableNameCursor; deallocate tableNameCursor; --Enable Table Constraint declare tableNameCursor cursor LOCAL FAST_FORWARD FOR SELECT * FROM @syncTablesNames; open tableNameCursor; fetch next FROM tableNameCursor INTO @tableName; WHILE (@@fetch_status = 0) BEGIN exec ('alter table ' + @tableName + ' check constraint all; '); fetch next FROM tableNameCursor INTO @tableName; END; close tableNameCursor; deallocate tableNameCursor; rollback
Но все же, мне кажется, лучше это делать стандартными средствами - через Excel.
Выгрузить в Excel таблицы с десятками полей из 7.3 - это тоже задача ещё
Если оценивать по трудоемкости, то мне кажется оптимально:
- Сделать вручную генерацию sql-скриптов на 7.3
- Запускать на 7.12, пока, не заработает
Так как названия коробочных колонок не должны меняться, а новые предполагается, что уже созданы, то должно быть быстрее, чем гонять Excel'ы.
Меня одно удивляет - в каждом проекте изобретался велосипед?
В каждом проекте перехода с 7.3 до 7.12 да, сейчас конечно обновления на порядок проще