Мне нужно, чтобы некоторые устаревшие данные были загружены в оперативную базу данных оракула (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 для данных, которые необходимо заполнить. существует некоторая логика, связанная с обработкой очистки данных, бизнес-правил и т. д., которые применяются через сценарий, и ожидается, что сгенерированные операторы вставки SQL будут выполняться в одном пакете, и это должно иметь возможность вводить все устаревшие данные.
предполагая, что максимальное значение последовательности равно 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.
верните приложение.
Теперь, по причине, по которой я публикую это так подробно ... мне нужны ваши предложения / отзывы о любых лазейках в этом дизайне, и если есть что-то, что я упускаю из виду.
Любой вклад приветствуется.
Спасибо!