Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
Добрый день, У нас есть две идентичные базы данных, двух клиентов. Поставлена задача перенести обоих в "облако" и обеспечить возможность переключаться между ними. Проблема заключается в том, что базы слегка различаются, а софт требует точного соответствия структур. Например: БАЗА1, ТАБЛИЦА1: ID , КОЛОНКА1, КОЛОНКА2, КОЛОНКА3... БАЗА2, ТАБЛИЦА1: КОЛОНКА1, КОЛОНКА2, КОЛОНКА3... (В БАЗА2\ТАБЛИЦА1 отсутствует колонка уникального идентификатора записи 'ID'). Есть ли какой-нибудь способ - как добавить ID в БАЗА2\ТАБЛИЦА1 так, чтобы порядок колонок сохранился и соответсвовал первой базе и при этом, все данные, хранящиеся в таблице второй базы, там и остались? То есть, чтобы стало: БАЗА2, ТАБЛИЦА1, ID , КОЛОНКА1, КОЛОНКА2, КОЛОНКА3... Например, через создание новой таблицы или как то еще. Это требуется сделать SQL скриптом , так как на самом деле, таких баз и таблиц очень много... Спасибо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2019, 16:31 |
|
||
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
SELECT 1 as ID, КОЛОНКА1, КОЛОНКА2, КОЛОНКА3... FROM БАЗА2 или как тупой нумератор строк используйте *RANK* функцию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2019, 20:23 |
|
||
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
главное, что бы вы понимали последствия использования такого ID в вашем софте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2019, 20:24 |
|
||
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
PizzaPizza, Не совсем понял, как SELECT изменит структуру базы? Необходимо, ятобы первой колонкой в обоих таблицах было условное поле ID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2019, 21:00 |
|
||
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
PizzaPizza, В данном конкретном случае, этот ID не используется и ни на что не влияет. Его необходимо добавить только для того, чтобы "выравнить" структуры различных баз между собой. Иначе, софт отказывается переключаться с одной базы на другую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2019, 21:02 |
|
||
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
Sergey V NЕсть ли какой-нибудь способ - как добавить ID в БАЗА2\ТАБЛИЦА1 так, чтобы порядок колонок сохранился и соответсвовал первой базе и при этом, все данные, хранящиеся в таблице второй базы, там и остались?Да, есть способ. Создать во второй базе таблицу с нужной структурой и временным именем, перелить в неё данные из существующей таблицы, удалить старую таблицу, переименовать новую в старую. Не забыть добавить все индексы, констрейны, описания полей и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2019, 23:27 |
|
||
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
alexeyvgSergey V NЕсть ли какой-нибудь способ - как добавить ID в БАЗА2\ТАБЛИЦА1 так, чтобы порядок колонок сохранился и соответсвовал первой базе и при этом, все данные, хранящиеся в таблице второй базы, там и остались?Да, есть способ. Создать во второй базе таблицу с нужной структурой и временным именем, перелить в неё данные из существующей таблицы, удалить старую таблицу, переименовать новую в старую. Не забыть добавить все индексы, констрейны, описания полей и т.д.если скрипт достаточно универсальный, должны быть проверки возможности перехода на новую структуру... например, при смене типа или уменьшении размерности поля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2019, 08:08 |
|
||
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
alexeyvg, Ну, в общем, я так и сделал. Создал скрипт для создания новой таблицы, потом перелил данные, затем дропнул, затем переименовал. Все бы хорошо, но таблицы создаются софтом и я не уверен, что если я пересоздам все нужные таблицы руками, они продолжат работать. Софт поддерживает потенциально любую базу данных. В данном конкретном случае - MS SQL. Поэтому и думал, что есть какой-нибудь способ отзеркалить таблицу с небольшими изменениями. Доступа к внутренним модулям софта у нас, естественно нет. Что там делается - неведомо. Я могу только визуально сравнить оригинальную и мою новую таблицу. Две конвертнул - вроде работают. Но это конкретно 2 системные таблицы. Там ни индексов, ни наворотов нет (и ID там необязателен - софт создает их и с ID и без - все зависит от настроек). А вот если потребуется конвертнуть какую-нибудь стандартную таблицу с данными, то получится или нет - 50/50... Дело в том, что MS SQL я занимался очень мало и опыта по нему практически нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2019, 13:05 |
|
||
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
andreymx, Размерность или несоответствие имен полей не столь важно (такое может произойти, если клиенты на разных версиях софта). Там больше критично системные установки (типа с ID или без и несоответствие количества полей). Размерность, имена и добавить/удалить поля - не проблема. Для этого есть модуль синхронизации, а вот с ID - он может быть, а может не быть. Но это системная настройка софта. Соответственно, если в настройках он есть, а в базе нет, то софт пытается его использовать, возникает ошибка и, видимо, при ошибке (он ее не показывает) софт отказывается переключаться. Причем, он даже в списке доступных баз такую базу не показывает... Клиентов около 100, в каждой таких несоответствующих таблиц по 10-ку... Ну есть еще вариант, выгрузить таблицы в CSV, софтом пересоздать их из мастер-настроек и, затем, перезалить CSV обратно. Но это все вручную. Пол жизни займет. Потому такую задачу и поставили... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2019, 13:19 |
|
||
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
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.02.2019, 17:32 |
|
||
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
alexeyvg, Спасибо, Алексей. Ну, в общем, примерно так и двигаюсь. Просто думал, ну а вдруг... Софт не столько кривой, сколько очень древний. Ему около 30 лет. Там на разных этапах его существования, то этот ID был обязателен, потом его обязательность убрали (под опцию). Ну, в итоге, в разных версиях и в зависимости от настроек, он то генерится при созданиии базы, то нет. Все бы ничего, да только вот когда сейчас появилась задача перенести всех в облако, начались проблемы. Встроенная синхронизация этот ID вообще игнорирует. Она сравнивает только основные поля, индексы и тп. ОК, буду пытаться. Посмотрю что из этого выйдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2019, 10:09 |
|
||
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
Sergey V N, софт конечно кривой, потому что он зависит от того, в каком порядке сервер выдаёт столбцы, что противоречит парадигме реляционных данных. Чтобы ничего не сломать надо или перезаливать в новые таблицы или мастерить представления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2019, 13:13 |
|
||
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
Владислав КолосовSergey V N, софт конечно кривой, потому что он зависит от того, в каком порядке сервер выдаёт столбцы, что противоречит парадигме реляционных данных. Чтобы ничего не сломать надо или перезаливать в новые таблицы или мастерить представления.Вообще софт не кривой, потому что он не зависит от "порядка полей". И это как раз является проблемой. У них задача - слить много баз в одну. Придётся либо приводить базы к эталону перед "слиянием", либо делать слияние так, что бы оно не зависило от порядка полей. Sergey V NВсе бы ничего, да только вот когда сейчас появилась задача перенести всех в облако, начались проблемы.А вы сделайте софт для слияния, вместо того, что бы приводить все базы к эталону. ИМХО это намного, намного проще. И дополнительный плюс - вы не трогаете базы клиентов, потому что если их трогать, то из кучи баз что то будет не работать (вадруг клиенты что то поправили, например?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2019, 14:10 |
|
||
|
Реструктуризация таблицы
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов, Не совсем так. Софт может работать практически с любой базой данных, под которую есть прямые драйвера или ODBC. Далеко не все из них SQL-ные. Есть вообще простецкая, но которую можно использовать только для демок. В промышленной эксплуатации ее не рекомендовано устанавливать. Она не слишком фаулт-толерантна и вообще (ну, если клиент уж совсем не хочет платить за что-то более или менее серьезное, ну тогда типа - ладно, используйте). Такие клиенты тоже есть. Но! С ними проще. Модуль синхронизации просто конвертирует базу из одного формата в другой и, естественно, здесь уже создается все как надо (но опять же, согласно настройкам). Но так как в облаке по дефолту этот ID включен, то и база будет сконвертирована и заюзана без проблем. Но таких мало. Есть базы с уникальным встроенным ID - RECNUM. Вот отсюда все и пошло. Где-то он есть, где-то его нет. Я, так понимаю, все три последние десятилетия разработчики с этим как то боролись. И все работало. Ну а сейчас надивгаются тучи (читай - "облака"). Здесь затычка и приключилась... Ну а как все допропорядочные селлеры, они решли более не продавать коробки, а продавать подписки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2019, 15:09 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=115&tid=1688316]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
34ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 342ms |

| 0 / 0 |
