【发布时间】:2012-08-01 05:30:33
【问题描述】:
我在现有应用程序的 Oracle 中有一个非常庞大的 DDL 脚本, 它没有存储过程。 只是表、序列和约束。
将其转换为 Postgres 的最佳方法是什么?
有人说最好手工完成,有人说有免费工具。 任何人都可以建议我最好的方法吗?
如果是手工的话, 请建议我必须进行哪些更改。
下面给出了 Oracle DDL 的示例, 请在转换为以下 DDL 的 Postgres 时通知要进行的更改。
- DDL for Table ACTOR_ROLE_INFO
--------------------------------------------------------
CREATE TABLE "PAYTM_RELEASE1"."ACTOR_ROLE_INFO"
( "ACTOR_ROLE_ID" NUMBER,
"ACTOR_ID" NUMBER,
"ROLE_ID" NUMBER,
"STATUS" NUMBER,
"CREATED_BY" NUMBER,
"CREATED_ON" TIMESTAMP (6) WITH TIME ZONE,
"MODIFIED_BY" NUMBER,
"MODIFIED_ON" TIMESTAMP (6) WITH TIME ZONE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;
--------------------------------------------------------
-- DDL for Table ACTOR_TYPES
--------------------------------------------------------
CREATE TABLE "PAYTM_RELEASE1"."ACTOR_TYPES"
( "ACTOR_TYPE_ID" NUMBER,
"ACTOR_TYPE" VARCHAR2(100 BYTE),
"ACTOR_DESCRIPTION" VARCHAR2(100 BYTE),
"CREATED_BY" NUMBER,
"CREATED_DATE" TIMESTAMP (6) WITH TIME ZONE,
"MODIFIED_BY" NUMBER,
"MODIFIED_DATE" TIMESTAMP (6) WITH TIME ZONE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;
【问题讨论】:
-
一些快速的想法:您需要删除除
TABLESPACE之外的所有表创建限定符,因为 Pg 不存在这些限定符。 (如果您解释了它们的用途以及哪些(如果有的话)对应用程序功能很重要,那将会有所帮助,即您需要一个替代方案)。NUMBER变为NUMERIC用于任意精度值,或特定更有效的类型,如integer等。您需要查看NUMBER和NUMERIC之间的兼容性差异。VARCHAR2通常会变成带有约束的text,或者varchar(n)。 -
如果 DDL 如此庞大,为两个平台维护它将是一场噩梦。您是否考虑过借此机会将其转换为可以生成 Pg 和 Oracle 的 DDL 脚本的抽象格式?一些模式逆向工程工具可以帮助自动化该过程。
-
是的,这将是一场噩梦,但我不是决定权威..我们是手工做的....我已经考虑了你的类型变化,....!非常感谢..!
标签: oracle postgresql ddl database-migration dbmigrate