TSQL внешние ключи на просмотрах? - PullRequest
20 голосов
/ 18 декабря 2009

У меня есть база данных SQL-Server 2008 и схема, которая использует ограничения внешнего ключа для обеспечения ссылочной целостности. Работает как задумано. Теперь пользователь создает представления для исходных таблиц для работы только с подмножествами данных. Моя проблема заключается в том, что фильтрация определенных наборов данных в некоторых таблицах, но не в других, нарушит ограничения внешнего ключа.
Представьте себе две таблицы «один» и «два». «one» содержит только столбец id со значениями 1,2,3. «Две» ссылки «одна». Теперь вы создаете представления для обеих таблиц. Представление для таблицы «два» ничего не фильтрует, в то время как представление для таблицы «один» удаляет все строки, кроме первой. Вы получите записи во втором представлении, которые нигде не указывают.

Есть ли способ избежать этого? У вас могут быть ограничения внешнего ключа между представлениями?

Некоторые уточнения в ответ на некоторые комментарии:
Мне известно, что лежащие в основе ограничения обеспечат целостность данных даже при вставке в представления. Моя проблема заключается в утверждениях, потребляющих взгляды. Эти утверждения были написаны с учетом исходных таблиц и предполагают, что некоторые объединения не могут завершиться неудачей. Это предположение всегда верно при работе с таблицами, но представления могут нарушить его.
Объединение / проверка всех ограничений при создании представлений в первую очередь раздражает из-за большого количества ссылающихся таблиц. Таким образом, я надеялся избежать этого.

Ответы [ 11 ]

0 голосов
/ 31 декабря 2009

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

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

Ограничения не выполняют никакой фильтрации, они только предотвращают неверные данные или каскадные изменения и удаления ключей.

...