Включение и выключение ограничений внешнего ключа - PullRequest
2 голосов
/ 03 ноября 2011

У нас есть длительный процесс 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 применяется только к будущим операциям.

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

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

1.Я нашел NO ACTION имя немного вводит в заблуждение, потому что это означает, что DML потерпит неудачу, если нарушит ограничение. Некоторые RDMS, в частности mysql, имеют более подходящее ключевое слово - RESTRICT, которое более наглядно.
2. Вы можете временно отключить / включить все ограничения с помощью ALTER TABLE ... NOCHECK/CHECK CONSTRAINT ALL

0 голосов
/ 03 ноября 2011

Я бы лично никогда не отключал ограничения FK.Это начало скользкого падения в ад.Они существуют по определенной причине.

Я бы разделил ваш ETL на пакеты по N строк и обернул каждый в транзакцию.Если транзакция не удалась из-за нарушения FK, зарегистрируйте ее и выполните все, что требуется для восстановления.Никогда не оставляйте плохие данные в.

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