我在其中也有在SIT中使用大约600表的数据库。在我们转向UAT时,我需要比较SIT中与UAT中不同的表(列名,数据类型,大小)的DDL。我正在研究以下方法。 (我没有PERM空间)我宁愿在数据库中这样做,而不是导出数据并通过unix进行比较。在不同的服务器比较DDL表 - Teradata的,
第一种方法:
create volatile table SIT (s_tablename varchar(30), s_ddl varchar(30000)) on commit preserve rows;
create volatile table UAT (u_tablename varchar(30), u_ddl varchar(30000)) on commit preserve rows;
DATABASE SIT;
我怎么能产生上述的DDL与SELECT语句插入到上面的数值?
1 SELECT 'SHOW TABLE ' || TRIM(TABLENAME) from dbc.tables where databasename='SIT' and tablekind='T' order by tablename;
如果我能有显示表即所得的,DDL与表名一起,我可以运行一个直接插入选择到SIT表(类似下图)
insert into SIT select trim(tablename <DDL_OF_TABLE> from dbc.tables where databasename='SIT' and tablekind='T'
进入UAT的数值是合适的,这样我就可以按照下面的方式加入它们以找出差异。
select sit.s_tablename, uat.u_tablename from sit left join uat on sit.s_tablename = uat.u_tablename and sit.s_ddl=uat.u_ddl where uat.u_tablename is NULL;
第二种方法:
选择从dbc.columns来自两个如下坐和UAT所有列信息并且将它们在Excel工作表(SIT,UAT有两种不同的服务器)进行比较。
SEL TABLENAME, COLUMNNAME, COLUMNFORMAT, COLUMNTYYPE, COLUMNLENGTH, NULLABLE, DECIMALTOTALDIGITS, DECIMALFRACTIONALDIGITS FROM DBC.COLUMNS WHERE DATABASENAME='SIT'ORDER BY TABLENAME, COLUMNNAME
2A) -
由于所得是巨大的(187000行 - 周边600表),Excel表单正在非常长进行比较,并给所得到的。我可以将上述查询分解成块并进行比较。但是,我试图在一部分中实现这一点。
2B) -
还有一个选项是导入上述选择结果为通过SQL助理易失性表(我没有访问运行实用程序),并下文做了减法运算。
sel * from SIT minus sel * from UAT;
但是,我觉得这是一个耗时的过程,通过SQL助手导入将大约187000行加载到2个易失性表中。另外,在上面的dbc.columns选择过程中,我应该使用zeroifnull或其他函数来克服null处理,以避免出现任何进一步的问题。
能否请您阐述双方的方法或任何更可行的解决方案的利弊?