Создайте Not Null FK в новой таблице в проекте базы данных

У меня есть таблица, в которой есть строки. Я использую проект базы данных SQL для управления БД и хочу обновить схему, добавив в эту таблицу новый столбец NOT NULL, который поставляется с ограничением FK для новой таблицы (также включенной в новую версию проект).

Это возможно? Я знаю, что могу использовать опцию для создания интеллектуальных значений по умолчанию для нового столбца FK, но это бесполезно, потому что у меня нет возможности поместить какие-либо строки в новую таблицу, на которую ссылается FK.

Какие варианты у меня есть? Поскольку сценарий перед развертыванием выполняется ПОСЛЕ выполнения сравнения схем, я не могу создать новую таблицу здесь, потому что сравнение запускается первым и определяет, что необходимо создать таблицу — это взрывается, когда он доходит до этой точки в сценарии. и обнаруживает, что таблица уже существует (создана во время предварительного развертывания)


person Simon Green    schedule 28.09.2015    source источник


Ответы (2)


Наше решение:

В сценарии перед развертыванием создайте новую временную таблицу и переместите в нее необходимые данные. В сценарии после развертывания мы читаем данные из этой временной таблицы и обновляем другие таблицы. Таким образом, вы не мешаете развертыванию базы данных и имеете все данные, необходимые для восстановления ссылок. И да, согласен, некрасиво.

person Backs    schedule 28.09.2015
comment
Я не думаю, что это сработает. Фактический процесс публикации по-прежнему будет пытаться 1/создать новую таблицу 2/создать новый столбец в существующей таблице и 3/создать FK из нового столбца в PK в новой таблице. Это не удастся, потому что даже при умных значениях по умолчанию FK не будет удовлетворен, потому что новая таблица в 1/ пуста. - person Simon Green; 28.09.2015
comment
@SimonGreen это работает, проект базы данных проверяет ограничения (и внешние ключи) в момент развертывания и после ваших сценариев. - person Backs; 29.09.2015
comment
Господи, так они и делают!!! Да, это все меняет. Я, должно быть, просто предположил, что сценарий после развертывания запускается после всего в основном сценарии публикации... но да, я могу просто вставить нужные мне записи в новую таблицу и установить нужные мне значения в моем новом столбце FK, и это все происходит до того, как будут наложены ограничения FK.... просто! Большое спасибо - person Simon Green; 29.09.2015

Я видел 3 подхода:

  1. Используйте сценарий предварительного сравнения, который делает то, что вы хотите, перед запуском sqlpackage.exe (или того, что вы используете для развертывания), он работает довольно хорошо и обычно просто добавить дополнительный «запустить этот скрипт» перед сравнением (https://the.agilesql.club/Blog/Ed-Elliott/Pre-Compare-and-Pre-Deploy-Scripts-In-SSDT).

  2. Сделайте это в поэтапном развертывании, поэтому в первом выпуске вы добавляете ограничение по умолчанию и исправляете существующие данные, а затем в более позднем выпуске применяете его с ненулевым ограничением.

  3. Вы можете написать свое собственное обновление с помощью участника развертывания.

Лично я использую 1 и 2, вариант 3 кажется излишним (p.s. я не забыл о вашей проблеме с перезаписи таблицы)

ed

person Ed Elliott    schedule 28.09.2015
comment
Привет, да, до сих пор я использовал вариант 1. Я больше не могу использовать параметр публикации правой кнопкой мыши-› в VS, у меня есть файл .bat, и я запускаю для него командную строку. Очень жаль, что вы не можете сделать это более интегрированным способом VS, я чувствую, что это серьезное упущение в функциональности .... но на данный момент похоже, что это правильный (единственный) ответ - person Simon Green; 28.09.2015
comment
Привет. Я делаю что-то подобное, я использую сценарий powershell для управления sqlpackage.exe и один из быстрых развертывателей, чтобы помочь с красным, зеленым, тестом, разработкой, в противном случае полная сборка и развертывание для меня слишком медленны. Сценарий powershell — тот же, что я использую в CI/Prod для развертывания или создания сценариев, т.к. они очень хорошо тестируются :) - person Ed Elliott; 28.09.2015
comment
См. ответ Бэкса ниже - оказывается, сценарий после развертывания запускается ДО того, как будут наложены ограничения FK Check. Поэтому я могу просто настроить записи в моей новой таблице и значения в моем столбце FK здесь, прежде чем будет проверено ограничение FK... - person Simon Green; 29.09.2015
comment
круто, да, похоже, что ограничения устанавливаются на NOCHECK, а затем возвращаются к CHECK после сценария после развертывания, это действительно полезно :) - person Ed Elliott; 29.09.2015