SSDT/ VS2015 Развертывание базы данных - публикация игнорирует вложенные представления
Я пытаюсь получить некоторые знания и примеры использования при разработке и развертывании баз данных SSDT и борюсь с некоторыми проблемами развертывания.
В частности, при использовании вложенных представлений. По какой-то неизвестной причине при попытке развернуть / опубликовать файлы в проекте в локальную / живую БД, похоже, путаются ссылки в представлениях.
В этом проекте у меня есть следующие представления (пример):
- View1
- View2
- View3
View1 ссылается на View2, а View3 ссылается на View1.
Сборка проекта работает нормально. однако когда я пытаюсь опубликовать базу данных, либо сгенерировав dacpac по снимку и опубликовав его в базе данных, либо позволить Visual Studio сгенерировать скрипт обновления после (или нет) сравнения схем, я получаю скрипт обновления, который пытается создать представления в что кажется логичным порядком, в котором они хранятся в проекте.
В этом случае View1 -> View2 -> View3. Это означает, что публикация не удалась из-за проблем со ссылками. Он не может создать представление, если ссылочное представление не существует.
Я пробовал несколько вариантов, добавляя dacpac в качестве ссылки в проекте различными способами (одна и та же база данных, разные базы данных одного и того же сервера без параметра базы данных), но во многих случаях я получаю ошибку sql71561 / SQL71508, которая была другой PITA решать.
В Интернете я не могу найти хороших источников, которые объясняют, как обойти эту проблему или объясняют, как это работает правильно.
Надеюсь, я смогу получить помощь здесь. Если вам нужен дополнительный вклад с моей стороны или вы хотите, чтобы я что-то попробовал, дайте мне знать.
1 ответ
Проблема была решена с помощью новых идей. При попытке создать демонстрационный код, чтобы поделиться с SO-сообществом, я случайно нашел решение, потому что мне нужно было очистить важные части данных (модели). Пожалуйста, позвольте мне уточнить, в чем была проблема.
Решение можно разделить на два решения:
- Конфигурация базы данных Проект / Решение
- как работают ссылки
Я поделюсь некоторыми соображениями по обоим вопросам.
Конфигурация базы данных Проект / Решение
Решение Visual Studio содержало один проект, в который были помещены все представления. Фактические таблицы и другие элементы базы данных были разделены в разных решениях / проектах.
Solution1
Project1
View1
View2
View3
Solution2
Project1
Tables
Security
Schemas
Etc...
Само представление содержало идентификаторы из трех частей [База данных]. [Схема]. [Таблица / Представление]. Это было как для элементов внутри проекта (представления), так и для элементов вне проекта (таблицы и т. Д.).
Простое использование этого отдельного Проекта только с представлениями привело к отсутствию ссылок. Не удалось найти ни другие виды, ни таблицы (см. Далее ссылки).
Одним из решений этой проблемы было обеспечение того, чтобы оба представления и таблицы были в одном решении / проекте. Даже при использовании трехчастных идентификаторов Visual Studio игнорирует их из-за существования всех элементов в одном проекте / решении. Он обнаружит зависимости таким образом.
как работают ссылки
Другим способом решения этой проблемы было правильное использование ссылок в визуальной студии. что является вторым возможным решением.
Рассматривая более ранний пример, где представления были в другом решении, поскольку другие элементы привели к отсутствующим ссылкам. Однако добавление dacpac в качестве ссылки на базу данных с параметром Same Database привело к конфликту ссылок, и элемент SQL71508 уже существует в модели. Это верно, потому что он существует в ссылках dacpac, и мы пытаемся создать новое представление с тем же именем, ссылающимся на себя в dacpac. Это потому, что он видит трехчастную ссылку как переменную для dacpac.
При использовании параметра dacpac для одного и того же Сервера, Различной базы данных, он разрешает смешанные ссылки, потому что видит трехчастные идентификаторы как внешнюю ссылку и думает, что вы создаете локальную копию представления, которое просматривает внешний dacpac. другими словами, он не будет обнаруживать вложенное представление, потому что думает, что вы ссылаетесь на отдельную базу данных, а не внутри проекта.
При создании проекта это не приведет к ошибкам, и развертывание будет работать. однако, поскольку он думает, что вы ссылаетесь на внешний источник данных (в виде dacpac), он не видит ссылку на другие локальные представления.
Решение этой проблемы (по крайней мере, это сработало для нас) состоит в том, чтобы использовать идентификаторы из двух частей в наших представлениях, когда нам нужна локальная ссылка на другие представления. Таким образом, он будет смотреть на другие файлы внутри проекта вместо dacpac, на который ссылаются.
Поскольку он будет обнаруживать ссылку на другие локальные представления, он будет правильно строить и обнаруживать зависимости в представлениях внутри локального проекта. Затем он создаст хороший порядок сборки для всех представлений.
Я полагаю, что вы также можете назначить другое имя переменной для Dacpac, на который ссылаются, полностью использовать идентификаторы из трех частей, но изменить их во внешнем dacpac, чтобы использовать только что назначенное имя переменной. Мы не проверяли это (но я сделаю это, когда вернусь домой сегодня вечером).
Таким образом, в целом это был хороший опыт изучения того, как ссылки на базы данных работают в проектах базы данных при использовании частичных проектов или когда вы разбили базу данных на несколько проектов / решений. Теперь, чтобы понять черный ящик этой Пандоры и превратить их в решение, ориентированное на будущее:)