Приложения уровня данных - после развертывания

Это такая простая вещь, что даже вопрос здесь заставляет меня чувствовать себя глупо, но так как я застрял в этом в течение длительного времени, я спрошу это здесь. Я работаю над приложением уровня данных в 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
Другие вопросы по тегам