Скрипт после развертывания ssdt запускается один раз

Я новичок в инструментах баз данных SQL Server и, возможно, делаю неверные предположения о том, что делают сценарии после развертывания ... так что поправьте меня, если я ошибаюсь.

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

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

Т.е. Могу ли я добавить какие-либо последующие поправки в сценарий в виде нового файла в проекте с включенным номером версии и добавить его в сценарий после развертывания, но каким-то образом проигнорировать предыдущий сценарий (возможно, без предварительного его удаления)? независимо от того, запускает ли он скрипт во время развертывания?

Есть ли конфигурация для такого рода вещей или это непреднамеренное поведение?


person Pricey    schedule 23.07.2013    source источник


Ответы (1)


Скрипты до и после развертывания предназначены для запуска при каждом выпуске проекта. Лучше всего сделать их повторяемыми. Добавьте проверки, чтобы, если данные уже существуют, вы не запускали их снова или что-то подобное. Вы можете создать какую-то базовую таблицу регистрации, чтобы сохранить это - если строка не найдена в таблице, запустите сценарий и поместите строку в таблицу.

Вы не можете указать проекту запускать только последнюю версию сценария, если имеется несколько сценариев, потому что все они встроены в один большой файл PreDeploy.sql или PostDeploy.sql. В каждом разделе / ​​сценарии вам понадобится что-то, что укажет ему, где искать, чтобы узнать, запускать или нет. Это может быть проверка существующих данных, проверка таблицы, проверка версии или что-то еще, но нужно где-то знать, что использовать, чтобы знать, запускать или нет.

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

Для наших целей мы делаем сценарии пригодными для повторного использования и удаляем их по мере запуска. Они все еще находятся в системе контроля версий, или вы можете использовать моментальный снимок для хранения этой версии проекта перед их удалением.

person Peter Schott    schedule 24.07.2013
comment
Ваш ответ в порядке, это то, чего я ожидал, мне просто интересно, может ли SSDT иметь некоторую конфигурацию для запуска один раз, но он не может знать ответ на это самостоятельно. - person Pricey; 25.07.2013
comment
Мне неизвестна такая конфигурация. Как проект узнает, что он был запущен один раз в любой данной базе данных без какой-либо таблицы или другого способа ссылаться на выполняемую работу? - person Peter Schott; 25.07.2013
comment
Я думал, что проект может (должен?) Знать, что он запускает сценарий так же, как он знает, что были внесены изменения в таблицу. Какой там барьер? - person Bob Horn; 29.01.2020
comment
Эти сценарии работают не так. Они всегда выполняются, поэтому вам нужно либо найти способы обойти это в процессе сборки, либо закодировать некоторые элементы, которые не запускают скрипт, если он уже был запущен. Или просто сделайте их повторно запускаемыми. Для более длинных сценариев либо удалите по завершении, либо напишите код, чтобы сценарий не запускался, если он уже был запущен. - person Peter Schott; 01.02.2020