Перенос автоматически сгенерированных идентификаторов из Oracle в SQL Server

В настоящее время я разрабатываю java-приложение для переноса данных базы данных Oracle в эквивалентную структурированную базу данных SQL Server, которую я перенес с помощью liquibase. Теперь я не мог понять, как перенести автоматически сгенерированные идентификаторы, поскольку это не так просто. Я хочу, чтобы они имели те же значения, что и в моей исходной базе данных, и я хочу, чтобы они были постоянными, поэтому, когда последний автоматически сгенерированный идентификатор был 177 для примера, я хочу, чтобы следующий сгенерированный был 178. Я знаю, что это расплывчатый вопрос но в настоящее время я просто думаю о концепции, которую можно применить в моем коде, поэтому любые предложения приветствуются. Заранее спасибо!


person Mad Scientist    schedule 07.11.2019    source источник
comment
Возможно, вы можете попробовать использовать SET IDENTITY_INSERT ‹tablename› ON перед вставкой данных! После этого вы можете измениться. Проверьте DBCC CHECKIDENT, чтобы изменить начальное значение столбца идентификации после вставки.   -  person MarcelS    schedule 07.11.2019
comment
Помощник по миграции SQL Server для Oracle сделает все это за вас. microsoft.com/en-us/download/details.aspx? идентификатор = 54258   -  person David Browne - Microsoft    schedule 12.11.2019
comment
@DavidBrowne-Microsoft Это обязательно должно быть опубликовано как ответ. Кстати. обрабатывает ли SSMA столбцы ГЕНЕРИРОВАННЫЕ ВСЕГДА и/или пользовательские автоматически увеличиваться?   -  person Lukasz Szozda    schedule 13.11.2019


Ответы (1)


Идея состоит в том, чтобы переместить данные из Oracle в SQL Server как есть, используя SSIS/связанный сервер/Polybase/bcp:

INSERT INTO SQL_Server_table(id, ...)
SELECT id, ...
FROM Oracle_table;

Если у таблицы есть свойство IDENTITY, вы должны сначала отключить его:

SET IDENTITY_INSERT SQL_Server_table ON

После того, как вы переместили данные, вам нужно установить идентификатор на максимальное значение:

DBCC CHECKIDENT ('SQL_Server_table', RESEED, <max_calculated_value>+1);

Если в таблице не определен столбец идентификаторов, вы можете использовать SEQUENCE:

CREATE SEQUENCE dbo.SQL_Server_table_seq
START WITH <max_calculated_value>+1
INCREMENT BY 1 ;  

ALTER TABLE SQL_Server_table
ADD CONSTRAINT df_SQL_Server_table_seq 
DEFAULT NEXT VALUE FOR dbo.SQL_Server_table_seq FOR [<identity_column>];

db‹>демонстрация скрипки

person Lukasz Szozda    schedule 12.11.2019
comment
почему мне нужно установить идентификатор на максимальное значение? - person Mad Scientist; 14.11.2019
comment
@MadScientist Чтобы избежать конфликтов, когда вы хотите вставить новые данные. Проверьте предоставленный пример - person Lukasz Szozda; 14.11.2019