2014-08-27 51 views
1

我需要將PostgreSQL數據庫的結構轉換爲Oracle。在PostgreSQL中,我有一個帶數據的postgres數據庫。使用目標數據庫的數據類型生成XML/SQL輸出

在Oracle中,我有一個空白數據庫,我想在其中編寫PostgreSQL中的postgres數據庫。

其實我不需要數據,只需要結構(關係)。

對此,我使用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> 
... 

我也生成一個純S QL-文件:

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=oracle.jdbc.OracleDriver \ 
    --classpath="C:\db_drivers\ojdbc14.jar" \ 
    --changeLogFile="./data.xml" \ 
    --url="jdbc:oracle:thin:@ip_here:orabeta" \ 
    --username=*** \ 
    --password=*** \ 
    --logLevel=debug \ 
    update  

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 
後暫時禁用所有約束(手動)

而且