Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Реструктуризация таблицы  [new]
Sergey V N
Member

Откуда:
Сообщений: 25
Добрый день,

У нас есть две идентичные базы данных, двух клиентов. Поставлена задача перенести обоих в "облако" и обеспечить возможность переключаться между ними. Проблема заключается в том, что базы слегка различаются, а софт требует точного соответствия структур.

Например:

БАЗА1, ТАБЛИЦА1: ID, КОЛОНКА1, КОЛОНКА2, КОЛОНКА3...
БАЗА2, ТАБЛИЦА1: КОЛОНКА1, КОЛОНКА2, КОЛОНКА3...

(В БАЗА2\ТАБЛИЦА1 отсутствует колонка уникального идентификатора записи 'ID').

Есть ли какой-нибудь способ - как добавить ID в БАЗА2\ТАБЛИЦА1 так, чтобы порядок колонок сохранился и соответсвовал первой базе и при этом, все данные, хранящиеся в таблице второй базы, там и остались? То есть, чтобы стало:

БАЗА2, ТАБЛИЦА1, ID, КОЛОНКА1, КОЛОНКА2, КОЛОНКА3...

Например, через создание новой таблицы или как то еще. Это требуется сделать SQL скриптом, так как на самом деле, таких баз и таблиц очень много...

Спасибо...
9 фев 19, 16:31    [21805284]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
PizzaPizza
Member

Откуда:
Сообщений: 286
SELECT 1 as ID, КОЛОНКА1, КОЛОНКА2, КОЛОНКА3... FROM БАЗА2
или как тупой нумератор строк используйте *RANK* функцию
9 фев 19, 20:23    [21805392]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
PizzaPizza
Member

Откуда:
Сообщений: 286
главное, что бы вы понимали последствия использования такого ID в вашем софте
9 фев 19, 20:24    [21805394]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
Sergey V N
Member

Откуда:
Сообщений: 25
PizzaPizza,
Не совсем понял, как SELECT изменит структуру базы? Необходимо, ятобы первой колонкой в обоих таблицах было условное поле ID.
9 фев 19, 21:00    [21805416]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
Sergey V N
Member

Откуда:
Сообщений: 25
PizzaPizza,
В данном конкретном случае, этот ID не используется и ни на что не влияет. Его необходимо добавить только для того, чтобы "выравнить" структуры различных баз между собой. Иначе, софт отказывается переключаться с одной базы на другую.
9 фев 19, 21:02    [21805417]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29293
Sergey V N
Есть ли какой-нибудь способ - как добавить ID в БАЗА2\ТАБЛИЦА1 так, чтобы порядок колонок сохранился и соответсвовал первой базе и при этом, все данные, хранящиеся в таблице второй базы, там и остались?
Да, есть способ.
Создать во второй базе таблицу с нужной структурой и временным именем, перелить в неё данные из существующей таблицы, удалить старую таблицу, переименовать новую в старую. Не забыть добавить все индексы, констрейны, описания полей и т.д.
9 фев 19, 23:27    [21805469]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52557
alexeyvg
Sergey V N
Есть ли какой-нибудь способ - как добавить ID в БАЗА2\ТАБЛИЦА1 так, чтобы порядок колонок сохранился и соответсвовал первой базе и при этом, все данные, хранящиеся в таблице второй базы, там и остались?
Да, есть способ.
Создать во второй базе таблицу с нужной структурой и временным именем, перелить в неё данные из существующей таблицы, удалить старую таблицу, переименовать новую в старую. Не забыть добавить все индексы, констрейны, описания полей и т.д.
если скрипт достаточно универсальный, должны быть проверки возможности перехода на новую структуру... например, при смене типа или уменьшении размерности поля
10 фев 19, 08:08    [21805542]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
Sergey V N
Member

Откуда:
Сообщений: 25
alexeyvg,

Ну, в общем, я так и сделал. Создал скрипт для создания новой таблицы, потом перелил данные, затем дропнул, затем переименовал.

Все бы хорошо, но таблицы создаются софтом и я не уверен, что если я пересоздам все нужные таблицы руками, они продолжат работать. Софт поддерживает потенциально любую базу данных. В данном конкретном случае - MS SQL. Поэтому и думал, что есть какой-нибудь способ отзеркалить таблицу с небольшими изменениями.

Доступа к внутренним модулям софта у нас, естественно нет. Что там делается - неведомо. Я могу только визуально сравнить оригинальную и мою новую таблицу.

Две конвертнул - вроде работают. Но это конкретно 2 системные таблицы. Там ни индексов, ни наворотов нет (и ID там необязателен - софт создает их и с ID и без - все зависит от настроек). А вот если потребуется конвертнуть какую-нибудь стандартную таблицу с данными, то получится или нет - 50/50...

Дело в том, что MS SQL я занимался очень мало и опыта по нему практически нет.
10 фев 19, 13:05    [21805621]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
Sergey V N
Member

Откуда:
Сообщений: 25
andreymx,

Размерность или несоответствие имен полей не столь важно (такое может произойти, если клиенты на разных версиях софта). Там больше критично системные установки (типа с ID или без и несоответствие количества полей). Размерность, имена и добавить/удалить поля - не проблема. Для этого есть модуль синхронизации, а вот с ID - он может быть, а может не быть. Но это системная настройка софта.

Соответственно, если в настройках он есть, а в базе нет, то софт пытается его использовать, возникает ошибка и, видимо, при ошибке (он ее не показывает) софт отказывается переключаться. Причем, он даже в списке доступных баз такую базу не показывает...

Клиентов около 100, в каждой таких несоответствующих таблиц по 10-ку...

Ну есть еще вариант, выгрузить таблицы в CSV, софтом пересоздать их из мастер-настроек и, затем, перезалить CSV обратно. Но это все вручную. Пол жизни займет. Потому такую задачу и поставили...
10 фев 19, 13:19    [21805627]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29293
Sergey V N
думал, что есть какой-нибудь способ отзеркалить таблицу с небольшими изменениями.
К сожалению, нет такого, нельзя простой командой поменять поля, или добавить поле в заданное место.

Либо писать скрипт самому (ну, или поискать такой в сети), или воспользоваться готовыми тулзами (но это не подходит, вам же нужно автоматизированное решение).
Sergey V N
Две конвертнул - вроде работают. Но это конкретно 2 системные таблицы. Там ни индексов, ни наворотов нет (и ID там необязателен - софт создает их и с ID и без - все зависит от настроек). А вот если потребуется конвертнуть какую-нибудь стандартную таблицу с данными, то получится или нет - 50/50...

Дело в том, что MS SQL я занимался очень мало и опыта по нему практически нет.
Нужно сделать стенд (тестовый сервер, на нём 2 базы, в общем, всё как в реальной задаче), и писать/отлаживать скрипт.

Да, работа это немаленькая, и требует квалификации.

Так и задача непростая, к тому же, вы таким образом правите чужой кривой закрытый софт, что, конечно, сложнее, чем править свой софт.

Вот, заодно её, квалификацию, и получите :-)
Sergey V N
Ну есть еще вариант, выгрузить таблицы в CSV, софтом пересоздать их из мастер-настроек и, затем, перезалить CSV обратно. Но это все вручную. Пол жизни займет. Потому такую задачу и поставили...
Вручную то можно из тулзов.

Например, эталонная база у вас как проект в Visual Studio (SSDT), потом указываете другую базу, вам студия делает скрипт приведения базы в соответствие к эталонной. Вы просматриваете этот скрипт, и если он нормальный, применяете. При этом алгоритм, параметры сравнения, сохраняете в виде шаблона.
Но это да, потребует ручного труда.

Или ещё можно найти какой то софт, Visual Studio не единственный.
10 фев 19, 17:32    [21805746]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
Sergey V N
Member

Откуда:
Сообщений: 25
alexeyvg,

Спасибо, Алексей. Ну, в общем, примерно так и двигаюсь. Просто думал, ну а вдруг...

Софт не столько кривой, сколько очень древний. Ему около 30 лет. Там на разных этапах его существования, то этот ID был обязателен, потом его обязательность убрали (под опцию). Ну, в итоге, в разных версиях и в зависимости от настроек, он то генерится при созданиии базы, то нет. Все бы ничего, да только вот когда сейчас появилась задача перенести всех в облако, начались проблемы. Встроенная синхронизация этот ID вообще игнорирует. Она сравнивает только основные поля, индексы и тп.

ОК, буду пытаться. Посмотрю что из этого выйдет.
11 фев 19, 10:09    [21806106]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6821
Sergey V N,

софт конечно кривой, потому что он зависит от того, в каком порядке сервер выдаёт столбцы, что противоречит парадигме реляционных данных. Чтобы ничего не сломать надо или перезаливать в новые таблицы или мастерить представления.
11 фев 19, 13:13    [21806312]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29293
Владислав Колосов
Sergey V N,

софт конечно кривой, потому что он зависит от того, в каком порядке сервер выдаёт столбцы, что противоречит парадигме реляционных данных. Чтобы ничего не сломать надо или перезаливать в новые таблицы или мастерить представления.
Вообще софт не кривой, потому что он не зависит от "порядка полей".

И это как раз является проблемой.

У них задача - слить много баз в одну.
Придётся либо приводить базы к эталону перед "слиянием", либо делать слияние так, что бы оно не зависило от порядка полей.
Sergey V N
Все бы ничего, да только вот когда сейчас появилась задача перенести всех в облако, начались проблемы.
А вы сделайте софт для слияния, вместо того, что бы приводить все базы к эталону.
ИМХО это намного, намного проще. И дополнительный плюс - вы не трогаете базы клиентов, потому что если их трогать, то из кучи баз что то будет не работать (вадруг клиенты что то поправили, например?)
11 фев 19, 14:10    [21806410]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
Sergey V N
Member

Откуда:
Сообщений: 25
Владислав Колосов,

Не совсем так. Софт может работать практически с любой базой данных, под которую есть прямые драйвера или ODBC. Далеко не все из них SQL-ные. Есть вообще простецкая, но которую можно использовать только для демок. В промышленной эксплуатации ее не рекомендовано устанавливать. Она не слишком фаулт-толерантна и вообще (ну, если клиент уж совсем не хочет платить за что-то более или менее серьезное, ну тогда типа - ладно, используйте). Такие клиенты тоже есть. Но! С ними проще. Модуль синхронизации просто конвертирует базу из одного формата в другой и, естественно, здесь уже создается все как надо (но опять же, согласно настройкам). Но так как в облаке по дефолту этот ID включен, то и база будет сконвертирована и заюзана без проблем. Но таких мало.

Есть базы с уникальным встроенным ID - RECNUM. Вот отсюда все и пошло. Где-то он есть, где-то его нет. Я, так понимаю, все три последние десятилетия разработчики с этим как то боролись. И все работало. Ну а сейчас надивгаются тучи (читай - "облака"). Здесь затычка и приключилась...

Ну а как все допропорядочные селлеры, они решли более не продавать коробки, а продавать подписки.
11 фев 19, 15:09    [21806501]     Ответить | Цитировать Сообщить модератору
 Re: Реструктуризация таблицы  [new]
Sergey V N
Member

Откуда:
Сообщений: 25
alexeyvg,

Ну, как вариант. Предложу. Я такие вопросы не решаю.
11 фев 19, 15:20    [21806515]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить