Поиск потерянных записей в SQL Server 2000 - PullRequest
1 голос
/ 29 января 2010

Я обременен базой данных ERP, в которой отсутствуют какие-либо внешние ключи и, следовательно, отсутствует ссылочная целостность.

Я пишу сценарий для проверки большинства основных таблиц в нашей базе данных на наличие потерянных записей.

Например, в этом случае я работаю с нашими таблицами продаж.

SLCDPM - Customer Master Table
SOMAST - Sales Order Master
SOITEM - Sales Order Items
SORELS - Sales Order Releases

По сути, для этих (и целого ряда других таблиц) мне нужно проверить, есть ли записи в SORELS, которые не отображаются ни в одной из таблиц над ним. Затем возьмите SOITEM и проверьте над ним. И т.д.

Я начал писать сценарии, но количество строк становится смешным. Вот где я начал с этих четырех таблиц.

select 'Sales Order Master',* from somast where fcustno not in (select fcustno from slcdpm where ftype <> 'P')
SELECT 'Sales Order Item',* FROM soitem WHERE fsono NOT IN (SELECT fsono FROM somast)
select 'Sales Order Release',* from sorels where (fsono+finumber) not in (select (fsono+finumber) from SOITEM)

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

Кто-нибудь знает сценарий, который я могу использовать, чтобы сделать это более автоматизированным или лучшим способом сделать это?

1 Ответ

2 голосов
/ 29 января 2010

И люди продают мусор базы данных вот так; меня всегда удивляет то, что я вижу в коммерческих продуктах.

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

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

Тогда я бы использовал курсор, чтобы пройти через таблицу и создать SQL-файл, чтобы проверить, есть ли в таблице FK потерянные записи.

Это все еще много кода, но, по крайней мере, вам не нужно было писать все это.

...