У меня есть база данных, в которой в SIT используется около 600 таблиц. Когда мы переходим на UAT, мне нужно сравнить DDL таблиц (имена столбцов, типы данных, размер) в SIT, которые отличаются от DDL в UAT. Я размышляю над следующими подходами. (У меня нет пространства 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 из вышеперечисленных с оператором выбора для вставки в указанном выше значения?
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 так, чтобы я мог ПОЛНОСТЬЮ ПРИСОЕДИНИТЬ их, как показано ниже, чтобы узнать различия.
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, УАТ находятся в 2-х разных серверов).
SEL TABLENAME, COLUMNNAME, COLUMNFORMAT, COLUMNTYYPE, COLUMNLENGTH, NULLABLE, DECIMALTOTALDIGITS, DECIMALFRACTIONALDIGITS FROM DBC.COLUMNS WHERE DATABASENAME='SIT'ORDER BY TABLENAME, COLUMNNAME
2а) -
В результирующей это огромные (187000 строк - около 600 таблиц), лист Excel принимает очень много времени, чтобы сравнить и дать равнодействующую. Я мог бы разбить вышеуказанный запрос на куски и сравнить его. Тем не менее, я пытаюсь добиться этого в одной части.
2b) -
еще один вариант, чтобы импортировать выше выберите равнодействующую в изменчивые таблицы через помощник SQL (я не имею доступ для запуска утилиты) и делать операцию минуса, как показано ниже.
sel * from SIT minus sel * from UAT;
Однако, я чувствую, что это время процесса загрузки потребляя около 187000 строк в 2 летучие таблицы через импорт SQL помощника. Кроме того, я должен преодолеть нулевую обработку с помощью zeroifnull или какой-либо другой функции во время вышеперечисленного select над dbc.columns, чтобы избежать дальнейших проблем, если это так.
Не могли бы вы рассказать о плюсах и минусах обоих подходов или более приемлемого решения?