【发布时间】:2014-11-28 05:49:47
【问题描述】:
我有一个数据库,其中在 SIT 中使用了大约 600 个表。当我们转向 UAT 时,我需要比较 SIT 中与 UAT 中不同的表的 DDL(列名、数据类型、大小)。我正在考虑以下方法。 (我没有PERM空间)我更喜欢在数据库中执行此操作,而不是导出数据并通过unix进行比较。
第一种方法:
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;
如何使用 select 语句生成上述的 DDL 以插入到上述值中?
1 SELECT 'SHOW TABLE ' || TRIM(TABLENAME) from dbc.tables where databasename='SIT' and tablekind='T' order by tablename;
如果我可以得到 SHOW TABLE 的结果,即 DDL 以及表名,我可以在 SIT 表中运行直接插入选择(如下所示)
insert into SIT select trim(tablename <DDL_OF_TABLE> from dbc.tables where databasename='SIT' and tablekind='T'
并适当地输入 UAT 值,以便我可以按如下方式将它们 LEFT JOIN 以找出差异。
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;
第二种方法:
从sit和uat中选择dbc.columns中的所有列信息,并在excel表中比较它们(SIT,UAT在2个不同的服务器中)。
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 助手将上述选择结果导入 volatile 表中(我无权运行实用程序)并执行以下减号操作。
sel * from SIT minus sel * from UAT;
但是,我觉得通过 SQL 助手导入将大约 187000 行加载到 2 个 volatile 表中是一个耗时的过程。此外,我应该在上述对 dbc.columns 的选择过程中使用 zeroifnull 或其他一些函数来克服 null 处理,以避免任何进一步的问题。
您能否说明这两种方法的优缺点或任何更可行的解决方案?
【问题讨论】: