2016-08-08 4 views
0

Я хочу переключиться на DACPAC для наших изменений в базе данных, но я немного в недоумении, что делать, когда дело доходит до более сложных обновлений баз. Чтобы проиллюстрировать, что я имею в виду, позвольте мне использовать простой пример, который имеет ту же проблему.Пакет DACPAC со сложными изменениями

Скажите, что у меня есть таблица Customer, которая в настоящее время работает, и я хочу добавить новую таблицу CustomerType с внешним ключом от Customer to CustomerType. Новый столбец в Клиенте должен быть необходим (не может быть нулевым), но не должен иметь значение по умолчанию.

Я хочу использовать произвольную формулу для установки начального типа для существующих клиентов при обновлении. Как я могу выполнить это с помощью DACPAC?

DACPAC будет знать только, что есть новый столбец и попытается добавить его в таблицу Customer, которая, конечно же, потерпит неудачу, потому что это необходимо. Установка значения по умолчанию нежелательна, так как это позволяет использовать нулевые значения.

Поскольку DACPAC должен быть доступен для обновления от каждого состояния до последнего, я не вижу, какую конфигурацию или сценарии до/после, которые я должен настроить, чтобы сделать эту работу.

Различные поиски дали неутешительный недостаток полезных результатов :(

Я надеюсь, что кто-то здесь может помочь. Спасибо заранее.

ответ

0

Ответ будет немного отличаться в зависимости от того, как вы планируя развернуть dacpac (s). Одним из распространенных случаев является то, что dacpac заменяет некоторую коллекцию сценариев обновления T-SQL, которые выполняются последовательно для обновления схемы базы данных с одной версии на другую. В этом случае вы можете выбрать один файл dacpac для каждой схемы-версии вашей базы данных и для обновления базы данных, которую вы планируете публиковать dacpacs в последовательности, чтобы обновить базу данных до последней версии.

В этом случае можно использовать пост-развертывающий скрипт для исправления схемы в зависимости от ситуации. Для вашего примера сценария вы можете смоделировать базу данных в проекте базы данных с новым столбцом, указанным как NULL, и без отношений FK с новой таблицей. Затем в сценарии после развертывания вы можете создать T-SQL, необходимый для выполнения инструкции UPDATE, чтобы заполнить новую таблицу и новый столбец, оператор ALTER, чтобы изменить тип столбца от NULL до NOT NULL и, наконец, добавить отношения внешних ключей.

Затем, двигаясь вперед, вы можете удалить сценарий после развертывания и смоделировать новый столбец и таблицу с соответствующими типами столбцов и FK.

+0

Ну, я хотел бы иметь возможность использовать DACPAC как «конечное состояние», как он предназначен, но с некоторым контролем над переходами между состояниями. Наличие сценария пост-развертывания, который изменяет значение nullability столбца, означает, что любое сравнение между DACPAC и полностью обновленной базой данных будет по-прежнему давать изменения (а именно, столбец, который не может быть нулевым, но должен быть нулевым в соответствии с «окончательным состояние ", которое находится в DACPAC) – Robba

+0

Согласен, это несовершенно. Мы (команда SSDT) ​​хотели бы улучшить эти сценарии, но впереди впереди другие приоритеты (например, добавление порядка столбцов игнорирования). –

+0

Я думал, что fk будет отключен до тех пор, пока не будет запущен скрипт пост-развертывания, чтобы вы могли настроить данные в пост-развертывании (сделать его re-runnable/idempotent, например, где new_col = null), и столбец будет добавлен без ограничения, post deploy запускает и обновляет столбец, и, наконец, ограничения включаются в конце обновления ?? –