Мне нужно загрузить некоторые устаревшие данные в рабочую базу данных Oracle (11gR2).База данных используется приложением jsp / spring / hibernate (3.2.5.ga).Последовательность используется для генерации уникальных ключей во всех таблицах.определение последовательности приведено ниже:
CREATE SEQUENCE "TEST"."HIBERNATE_SEQUENCE" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1000 CACHE 20 NOORDER NOCYCLE
Идея загрузки данных / ETL состоит в том, чтобы создать сценарий, который начинается с максимального значения последовательности, с помощью команды
select HIBERNATE_SEQUENCE.NEXTVAL from dual
в начале процесса генерации скрипта - и сгенерированные операторы SQL Insert для данных, которые необходимо заполнить.Существует некоторая логика, связанная с обработкой данных, бизнес-правил и т. д., которые применяются с помощью сценария, и ожидается, что сгенерированные операторы SQL Insert будут выполняться в одном пакете и должны иметь возможность вводить все устаревшие данные.
при условии, что максимальное значение последовательности равняется 1000 - скрипт использует это как переменную, и приращения по необходимости, и выходные данные SQL INSERTS будут такими, как показано ниже:
INSERT INTO USER_STATUS(ID, CREATE_DATE, UPDATE_DATE, STATUS_ID, USER_ID)
VALUES (**1001**, CURRENT_DATE, CURRENT_DATE, 20, 445);
INSERT INTO USER_ACTIVITY_LOG(ID, CREATE_DATE, UPDATE_DATE, DETAILS, LAST_USER_STATUS_ID)
VALUES (**1002**, CURRENT_DATE, CURRENT_DATE, 'USER ACTIVITY 1', **1001**);
INSERT INTO USER_STATUS(ID, CREATE_DATE, UPDATE_DATE, STATUS_ID, USER_ID)
VALUES (**1003**, CURRENT_DATE, CURRENT_DATE, 10, 445);
INSERT INTO USER_ACTIVITY_LOG(ID, CREATE_DATE, UPDATE_DATE, DETAILS, LAST_USER_STATUS_ID)
VALUES (**1004**, CURRENT_DATE, CURRENT_DATE, 'USER ACTIVITY 3', **1003**);
Я создал несколько макетовSQL, чтобы показать идею того, каким будет выходной INSERTS - в операциях вставки будет гораздо больше таблиц.всякий раз, когда нам нужно внести изменения в данные из серверной части, мы будем использовать HIBERNATE_SEQUENCE.NEXTVAL, чтобы получить следующее уникальное значение ключа.но поскольку сценарий генерации sql выполняется в автономном режиме, он не использует HIBERNATE_SEQUENCE.NEXTVAL, но вместо этого пытается увеличить локальную переменную.
Предположение, что мы имеем возможность сгенерировать (и запустить)этот сценарий должен
- иметь приложение, отключенное для обслуживания
- , не иметь активности базы данных во время выполнения сценария и запускаться с максимальным значением последовательности.
- генерирует SQL
запускает SQL-коммит.
при условии, что в процессе генерации скрипта максимальное значение последовательности увеличится с 1000 до 5000 - после запуска скрипта и загрузки данных HIBERNATE_SEQUENCE необходимо будет удалить/ создан, чтобы начинаться с 5001.
вернуть приложение в исходное состояние.
Теперь по той причине, по которой я публикую это, в таких деталях... мне нужны ваши предложения / замечания по поводу любых лазеек в этом дизайне, и если есть что-то, что я пропускаю.
Любой вклад приветствуется.
Спасибо!