Приложения уровня данных - после развертывания
Это такая простая вещь, что даже вопрос здесь заставляет меня чувствовать себя глупо, но так как я застрял в этом в течение длительного времени, я спрошу это здесь. Я работаю над приложением уровня данных в Visual Studio. У меня есть обычные вещи, такие как таблицы, хранимые процедуры и некоторые данные после развертывания. По умолчанию приложение уровня данных поставляется с папкой Scripts/Post-Deployment. Внутри этой папки есть файл с именем Script.PostDeployment.sql. Просто чтобы быть немного более организованным, я создаю папки внутри Post-Deployment в виде StaticData и TestData. Мои операторы вставки для создания данных расположены внутри этих папок. Итак, основываясь на этой структуре, я добавляю следующий код в мой Script.PostDeployment.sql:
/*
Post-Deployment Script Template
--------------------------------------------------------------------------------------
This file contains SQL statements that will be appended to the build script.
Use SQLCMD syntax to include a file in the post-deployment script.
Example: :r .\myfile.sql
Use SQLCMD syntax to reference a variable in the post-deployment script.
Example: :setvar TableName MyTable
SELECT * FROM [$(TableName)]
--------------------------------------------------------------------------------------
*/
:r .\StaticData\States.sql
:r .\TestData\Logins.sql
Проблема в том, что приведенный выше код не работает. По какой-то непонятной причине команда deploy просто игнорирует пути и ищет States.sql и Logins.sql в Scripts/Post-Deployment, а не в соответствующих подпапках. Кто-нибудь еще сталкивался с чем-нибудь подобным? Очень простая проблема, но я всегда буду обходиться этим. Я старался изо всех сил, чтобы объяснить, но задавайте вопросы, и я могу попытаться прояснить ситуацию. Спасибо!
3 ответа
Я посмотрел на ваш пример кода. Когда я пытался воспроизвести это, я использовал проект базы данных SQL 2008 в Visual Studio 2010, но то, что ваш проект - приложение уровня данных, и это совсем другое дело; когда я переключился на использование приложения уровня данных, я смог воспроизвести то, что вы видите.
Приложения уровня данных создают пакеты DAC, которые содержат определения объектов, а также содержат пользовательские сценарии, такие как сценарии до и после развертывания. Я не уверен на 100% (раньше я не использовал пакеты DAC, поэтому я основываюсь на наблюдениях и исследованиях), но я предполагаю, что файловая структура пакета DAC не поддерживает папки в папке Script\Post-развертывания; Я предполагаю, что это имеет довольно строгую структуру папок внутри. Следовательно, DACCompiler, по-видимому, предназначен для удаления только имен файлов из ссылок на файлы в сценарии после развертывания и игнорирует путь к каталогу.
Здесь есть технический документ по приложениям уровня данных. В нем есть раздел о добавлении сценария после развертывания в пакет, и в этом разделе приведены некоторые рекомендации, включая следующие:
• При работе в Solution Explorer рекомендуется включать все команды после развертывания в файл сценария Script.PostDeployment.sql. Это связано с тем, что в пакет DAC включен только один файл после развертывания. Другими словами, вы не должны создавать несколько файлов.
Технически, теперь это то, что делает команда:r, но вам может быть проще просто вставить команды непосредственно в файл вручную.
Также возможно, что это просто ошибка в дизайне DACCompiler.
Вот что я рекомендую вам сделать:
- На данный момент проще всего - я полагаю - просто переместить сценарии прямо в папку Post-Deployment; дать им уникальные, описательные имена, чтобы компенсировать отсутствие подкаталогов.
- В качестве альтернативы, если вы действительно хотите сохранить подкаталоги, добавьте команду pre-build в ваш проект; попросите его скопировать сценарии из подкаталогов в каталог после развертывания до начала сборки (вам необходимо убедиться, что у сценариев есть уникальные имена файлов)
- Если вы считаете, что это ошибка или функция, которая должна существовать, перейдите на
http://connect.microsoft.com/SQLServer и рекомендуем, чтобы команда продукта
обратитесь к нему в будущей версии продукта. Это отличное место для вынесения рекомендаций такого рода, потому что обратная связь направляется команде разработчиков продукта, сообщество пользователей в целом может проголосовать за отзывы, чтобы увеличить их вес, а группа разработчиков продукта может сообщить вам информацию об отзывах.
И, конечно, вы могли бы подождать и посмотреть, есть ли у кого-то другой ответ, и если да, то отлично! Но я предполагаю, что если никто еще не ответил, то, вероятно, его нет; Я конечно не мог найти что-нибудь в моем копании.
Я надеюсь, что в целом эта информация полезна. Я хотел бы дать вам способ заставить его работать сейчас, но я думаю, что вам лучше всего работать в рамках ограничений текущего дизайна и публиковать отзывы в Connect.
Удачи.
У меня есть чувство, что это будет слишком поздно, чтобы помочь с вашей проблемой, но это может стоить посмотреть. Формат dacpac - это просто zip-файл, содержащий серию XML-файлов и сценариев SQL. Если вы измените расширение файла на zip, вы сможете получить доступ к содержащимся в нем файлам. Файл postdeploy.sql должен содержать совокупность вашего сценария пост-развертывания и любых других, на которые он ссылается.
Я только что попробовал это с помощью Visual Studio 2013, и это работает.
IF ( '$(DeployType)' = 'Qualification' )
BEGIN --Run scripts
PRINT 'Deploying Qualification Specific scripts.'
:r .\Qualification\"QualificationSpecificTestScript.sql"
END
ELSE IF ( '$(DeployType)' = 'Production' )
BEGIN --Run scripts
PRINT 'Deploying Production Specific scripts.'
:r .\Production\"ProductionSpecificTestScript.sql"
END
Содержимое QualificationSpecificTestScript.sql
а также ProductionSpecificScript.sql
вставляются в сгенерированный скрипт Post Deployment.
Вот сгенерированный файл скрипта (только соответствующий раздел):
IF ( '$(DeployType)' = 'Qualification' )
BEGIN --Run scripts
PRINT 'Deploying Qualification Specific scripts.'
begin transaction;
PRINT 'IN QUALIFICATION ENVIRONMENT POST DEPLOYMENT SCRIPT'
commit transaction;
END
ELSE IF ( '$(DeployType)' = 'Production' )
BEGIN --Run scripts
PRINT 'Deploying Production Specific scripts.'
begin transaction;
PRINT 'IN PRODUCTION ENVIRONMENT POST DEPLOYMENT SCRIPT'
-- TODO: Confirm this record should be deleted
--DELETE TB_VariableName where Id = 9514
commit transaction;
END