Вопрос

Перенос данных с 7.3 на 7.12

Коллеги, у кого был опыт, поделитесь лучшими практиками.

Есть bpm'online CRM 7.3, которая автоматически на 7.4 (и далее) не переводится. Техподдержка предложила сделать всё руками на новой системе (что технически возможно).

Но появляется другой вопрос - как переносить данные? Через Excel довольно сложно будет, учитывая, что надо перенести настройки прав, пользователей, системные настройки, прикрепленные файлы и т.п.

Возможно, в мире существует набор SQL-скриптов, которые делают это для базовой конфигурации (для измененной уже допишем)?



Заранее спасибо за варианты решения

Нравится

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

Добрый день.

Есть пользовательский скрипт, предназначенный для переноса данных. Скрипт идет по списку таблиц, указанных пользователем, проверяет соответствие полей в таблицах обеих БД, формирует запрос и выполняет его:

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 - это тоже задача ещё 

Если оценивать по трудоемкости, то мне кажется оптимально:

  1. Сделать вручную генерацию sql-скриптов на 7.3
  2. Запускать на 7.12, пока, не заработаетdevil

Так как названия коробочных колонок не должны меняться, а новые предполагается, что уже созданы, то должно быть быстрее, чем гонять Excel'ы.

Меня одно удивляет - в каждом проекте изобретался велосипед?

В каждом проекте перехода с 7.3 до 7.12 да, сейчас конечно обновления на порядок проще

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