2014-08-27 7 views
1

PostgreSQL 데이터베이스의 구조를 Oracle으로 변환해야합니다. PostgreSQL에서는 데이터가있는 postgres 데이터베이스가 있습니다.대상 데이터베이스의 데이터 유형으로 XML/SQL 출력 생성

오라클에는 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)

이 가능한 (DML없이 데이터)를 DDL없는 구조의 복사본을 만드는 : 여기 일부 예이다.

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 

그리고 :

는 데이터를 마이그레이션 (옵션 --diffTypes = "data") 유사 가능

관련 문제