SIT에서 약 600 개의 테이블이 사용되는 데이터베이스가 있습니다. 우리가 UAT로 옮기고 있기 때문에, SIT에서 테이블의 DDL (컬럼 이름, 데이터 유형, 크기)을 UAT의 DDL과 비교해야합니다. 나는 다음과 같은 접근법에 대해 궁리하고있다. (필자는 PERM 공간이 없다.) 필자는 데이터를 내보내고 유닉스를 비교하는 것보다는 데이터베이스에서이 작업을 선호한다.다른 서버의 테이블 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을 생성 할 수 있습니까? 나는 테이블 표시, 즉의 결과를 가질 수 있다면
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는 적절하게 값을 매기므로 아래에서 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;
두 번째 방법 :
아래와 같이 모두에서 dbc.columns 앉아 UAT의 모든 열 정보를 선택하고 엑셀 시트 (UAT는 2 개 개의 다른 서버에있는, SIT)에서 그들을 비교할 수 있습니다.SEL TABLENAME, COLUMNNAME, COLUMNFORMAT, COLUMNTYYPE, COLUMNLENGTH, NULLABLE, DECIMALTOTALDIGITS, DECIMALFRACTIONALDIGITS FROM DBC.COLUMNS WHERE DATABASENAME='SIT'ORDER BY TABLENAME, COLUMNNAME
2A) -
결과로 거대 (187,000 행이다 - 약 600 테이블), 엑셀 시트는 비교 결과를 제공하는 것은 매우 오래 걸리는. 나는 위 쿼리를 청크로 나누어 비교할 수있다. 그러나, 나는 이것을 한 부분에서 달성하려고 노력하고있다.
2B) -
또 하나의 옵션은 SQL 보조를 통해 휘발성 테이블로 위의 선택 결과를 가져 오는 것입니다 (나는 유틸리티를 실행) 아래와 같이 빼기 작업을 할 수있는 권한이 없습니다.
sel * from SIT minus sel * from UAT;
그러나, 나는 그것이 SQL 보조 가져 오기를 통해 2 개 휘발성 테이블에 187,000 행 주위에 로딩 시간이 걸리는 과정이라고 생각합니다. 또한, 나는 그 이상의 문제가 발생하지 않도록하기 위해 dbc.columns를 통해 위에서 선택한 동안 zeroifnull 또는 다른 함수를 사용하여 null 처리를 극복해야합니다.
두 방법 또는 더 이상 가능한 해결책의 장단점에 대해 자세히 설명해 주시겠습니까? SQL Assistant는 지금 제공하는 재직자를위한