Извлечь подмножество данных из базы данных на основе FK и импортировать в другую базу данных - PullRequest
0 голосов
/ 08 мая 2018

Рассмотрим базу данных с 50-100 таблицами, которые все могут отслеживать все их зависимости FK прямо и косвенно (до 4-5 глубинных связей) обратно в "Table1".

В принципе, если была удалена одна запись в Таблице 1 и были включены каскадные удаления, тогда подмножество данных будет удалено из всех таблиц.

Моя цель - не удалять эти данные; вместо этого я хотел бы иметь возможность сценарий (копировать, а не удалять) это подмножество данных в файл . Тогда я хотел бы иметь возможность импортировать эти данные в другую непустую базу данных с той же схемой . Конечно, мне нужно сохранить все эти отношения, а не конфликтовать с какими-либо существующими ключами во второй базе данных.

Я понимаю, что это нетривиальная задача. Самая близкая подобная тема, которую я нашел, была здесь . ( Редактировать: Это требование является новым для существующей и успешной базы данных SQL. Я знаю, это уродливо и, возможно, не практично.)

Мой вопрос: Какие инструменты и методы можно использовать для упрощения этой задачи?

Мы используем SQL Server и в настоящее время используем .NET, EF6, C #. Подмножество данных будет иметь размер около 1-3 МБ.

Спасибо!

Редактировать: Удалите некоторые умозрительные утверждения и добавили примеры таблиц ниже, где я хотел бы извлечь все данные со связями в одну запись в Таблице 1:

Table1
    Table1_Id (PK)
    Data1

Foo
    Foo_Id (PK)
    Table1_Id (FK)
    FooData

Bar
    Bar_Id (PK)
    Table1_Id (FK)
    BarData

Ding
    Ding_Id (PK)
    Foo_Id (FK)
    Bar_Id (FK)
    DingData

1 Ответ

0 голосов
/ 08 мая 2018

Если вы хотите, чтобы это происходило OnDelete, я сначала подумал, что вам нужно использовать триггеры, и вам нужно либо поместить триггер на каждую таблицу, которая является Parent в цепочке отношений, либо один триггер на «Table1». "нужно будет вызвать процедуру, которая идет по всей цепочке.

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

Итак, что вы можете сделать, используя метод одиночного триггера, это запустить триггер для заполнения таблицы, в которой просто есть PK строки, удаляемой из «Table1». Затем запустите задание, которое вызывает пакет служб SSIS. Пакет читает таблицу, чтобы выяснить, какая строка была удалена, а затем начинает серию потоков данных для создания ваших файлов.

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

В качестве альтернативы, если вы установите триггер для каждой родительской таблицы, вы можете сделать так, чтобы этот триггер выполнял массовый экспорт связанных строк в дочерней таблице. Затем запланированное задание может время от времени выполняться и импортировать любые найденные файлы во вторую базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...