2014-08-27 2 views
1

Мне нужно преобразовать структуру баз PostgreSQL в Oracle. В PostgreSQL у меня есть база данных postgres с данными.Генерировать вывод XML/SQL с типами данных целевой базы данных

В Oracle у меня есть пустая база данных, в которой я хочу написать базу данных postgres, которая в PostgreSQL.

На самом деле, мне не нужны данные, только структура (отношения).

Для этого я использую Liquibase. Я получаю изменений от PostgreSQL с помощью команды:

liquibase \ 
    --driver=org.postgresql.Driver \ 
    --classpath="C:\db_drivers\postgresql-9.3-1102.jdbc3.jar" \ 
    --changeLogFile="./postgresql_changelog.xml" \ 
    --url="jdbc:postgresql://localhost:5432/postgres" \ 
    --username=schema_name_here \ 
    --password=************** \ 
    --logLevel=debug \ 
    --defaultSchemaName=sep \ 
    generateChangeLog 

После этого я пытаюсь создавать объекты в базе данных Oracle:

liquibase \ 
    --driver=oracle.jdbc.OracleDriver \ 
    --classpath="C:\db_drivers\ojdbc14.jar" \ 
    --changeLogFile="./postgresql_changelog.xml" \ 
    --url="jdbc:oracle:thin:@ip_here:orabeta" \ 
    --username=*** \ 
    --password=*** \ 
    update 

Не работает: ORA-00902

Вот фрагмент postgresql_changelog.xml:

... 
<changeSet author="Alexey (generated)" id="1409146335011-53"> 
    <createTable tableName="TABLE1A"> 
     <column name="total_pk" type="INT8"> 
     <constraints nullable="false"/> 
     </column> 
     <column name="form_fk" type="INT8"> 
     <constraints nullable="false"/> 
     </column> 
... 

Я также генерировать чистый SQL- файла:

liquibase \ 
    --driver=oracle.jdbc.OracleDriver \ 
    --classpath="C:\db_drivers\ojdbc14.jar" \ 
    --changeLogFile="./postgresql_changelog.xml" \ 
    --url="jdbc:oracle:thin:@ip_here:orabeta" \ 
    --username=*** \ 
    --password=*** \ 
    updateSQL > update.sql 

Вот фрагмент update.sql:

... 
CREATE TABLE SCHEMA_HERE.TABLE1A (total_pk INT8 NOT NULL, form_fk INT8, .....etc); 
INSERT INTO SCHEMA_HERE.TABLE1A (ID, FORM_ID, ...etc) 
... 

Я хотел бы создать файл, в котором все типы данных соответствуют целевой базе данных, то есть, что я хочу создать. Я могу написать простой парсер, который заменяет типы данных, но это неправильное решение - может быть много базы данных.

Возможно ли генерировать вывод XML/SQL с типами данных целевой базы данных?

Возможно, существует опция, позволяющая генерировать выходные данные с помощью «абстрактных» типов данных? Т.е. с типами данных, которые не находятся в реальных базах данных, например, вместо INT8 - абстрактный целочисленный тип данных и т. Д.

Буду очень признателен за информацию. Спасибо всем.

ответ

0

На самом деле, необходимо вручную исправить типы данных в сгенерированном файле (а не только типы данных, но также и всю спецификацию базы данных (уменьшить длину имен ограничений, индексов и т. Д.). . типы данных не преобразуются автоматически

. Например:

... 
<changeSet author="Alexey (generated)" id="1409146335011-53"> 
    <createTable tableName="TABLE1A"> 
     <!-- replace INT8 to NUMBER(16) for Oracle (for example) --> 
     <column name="total_pk" type="INT8">   
     <constraints nullable="false"/> 
     </column> 
     <!-- replace INT4 to NUMBER(10) for Oracle (for example) --> 
     <column name="form_fk" type="INT4"> 
     <constraints nullable="false"/> 
     </column> 
... 

После этого выполните команду:

liquibase \ 
    --driver=oracle.jdbc.OracleDriver \ 
    --classpath="C:\db_drivers\ojdbc14.jar" \ 
    --changeLogFile="./postgresql_changelog.xml" \ 
    --url="jdbc:oracle:thin:@ip_here:orabeta" \ 
    --username=*** \ 
    --password=*** \ 
    update 

Структура будет сгенерирована в целевой базе данных.

Но, на самом деле, могут быть использованы «абстрактные» типы данных, как пишут в документации: Liquibase, Column tag

Чтобы помочь сделать скрипты независимым от базы данных, следующие «общие» типы данных будут преобразованы в правильная реализация базы данных: BOOLEANCURRENCYUUIDCLOBBLOBDATEDATETIMETIME BIGINT

Также указывается тип java.sql.Types.*, который также будет преобразован в правильный тип . При необходимости можно включить точность. Вот некоторые примеры: java.sql.Types.TIMESTAMP java.sql.Types.VARCHAR(255)

И можно сделать копию структуры без DDL (и данные без DML).

Аналогично можно перенести данные (опция --diffTypes = "data"):

liquibase \ 
    --driver=org.postgresql.Driver \ 
    --classpath="C:\db_drivers\postgresql-9.3-1102.jdbc3.jar" \ 
    --changeLogFile="./data.xml" \ 
    --url="jdbc:postgresql://localhost:5432/postgres" \ 
    --username=*** \ 
    --password=*** \ 
    --logLevel=debug \ 
    --defaultSchemaName=schema_name_here \ 
    --diffTypes="data" \ 
    generateChangeLog 

И после временного отключения всех ограничений (вручную):

liquibase \ 
    --driver=oracle.jdbc.OracleDriver \ 
    --classpath="C:\db_drivers\ojdbc14.jar" \ 
    --changeLogFile="./data.xml" \ 
    --url="jdbc:oracle:thin:@ip_here:orabeta" \ 
    --username=*** \ 
    --password=*** \ 
    --logLevel=debug \ 
    update  
Смежные вопросы