У нас есть длительный процесс ETL, который передает данные из входных файлов через серию таблиц.
Я рассматриваю маловероятную возможность добавления реляционной целостности в наши таблицы, но я не хочу, чтобы наш процесс ETL умер, когда он сталкивается с нарушением. Я также хочу, чтобы записи, которые нарушают ссылочную целостность, все еще загружались. Однако, в конце концов, я хочу знать обо всех нарушениях ссылочной целостности.
Способ 1:
Я мог бы отключить ссылочную целостность и написать процедуру SQL, которая запускает несколько хранимых процедур для идентификации записей, которые нарушают целостность отношений, но мне действительно нравится идея целостности отношений, которая находится в самих таблицах, потому что я чувствую, что это документирует базу данных в лучшее место - дб.
Способ 2:
Вместо того, чтобы писать набор пользовательских запросов для выявления нарушителей, я думаю, что мы должны отбросить всю ссылочную целостность в начале нашего процесса, а затем добавить его в конце. Там, где мы получаем исключения, мы знаем, что есть нарушения. Мне нравится этот подход, но не похож на метод 1, где SQL может быть написан так, чтобы нацеливаться только на записи, только что добавленные для потенциальных нарушителей, и добавление ref целостности обратно, вероятно, пересмотрит всю таблицу - таблицу, которая постоянно растет. Когда проверка целостности снова включается, потребитель данных может быть уверен, что данные «хорошие», не выполняя больше запросов на лету. Мне это нравится ...
Есть ли третий подход?
Я вижу, что T-SQL поддерживает такие команды, как
NOCHECK CONSTRAINT
ON UPDATE NO ACTION
ON INSERT NO ACTION
но я не уверен, как они на самом деле предназначены для использования. Например,
ALTER TABLE dbo.TableName
NOCHECK CONSTRAINT FK01
Намерено ли это отключить проверку constrationmt, когда у вас есть надежный источник? Я предполагаю, что если он выключен, а затем включен таким образом, настройка chg применяется только к будущим операциям.
Какой наилучший подход вы бы использовали, чтобы позволить процессу завершиться до конца и при этом идентифицировать все нарушения реляционной целостности или потенциальные нарушения реляционной целостности?