Приложения уровня данных - после развертывания - PullRequest
3 голосов
/ 27 февраля 2011

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

6 голосов
/ 01 марта 2011

Я взглянул на ваш пример кода.Когда я пытался воспроизвести это, я использовал проект базы данных SQL 2008 в Visual Studio 2010, но то, что ваш проект является приложением уровня данных, и это совсем другое дело;когда я переключился на использование приложения уровня данных, я смог воспроизвести то, что вы видите.

Приложения уровня данных создают пакеты DAC, которые содержат определения объектов, а также содержат пользовательские сценарии, такие каксценарии до и после развертывания.Я не уверен на 100% (раньше я не использовал пакеты DAC, поэтому я основываюсь на наблюдениях и исследованиях), но я предполагаю, что файловая структура пакета DAC не поддерживаетпапки в папке Script \ Post-развертывания;Я предполагаю, что это имеет довольно строгую структуру папок внутри.Следовательно, DACCompiler, похоже, предназначен для удаления только имен файлов из ссылок на файлы в сценарии после развертывания и игнорирует путь к каталогу.

В приложениях уровня данных здесь * есть технический документ1006 *.В нем есть раздел о добавлении сценария после развертывания в пакет, и в этом разделе приведены некоторые рекомендации, включая следующие:

• При работе в Solution Explorer рекомендуется включать всекоманды после развертывания в файле сценария Script.PostDeployment.sql.Это связано с тем, что в пакет DAC включен только один файл после развертывания.Другими словами, вы не должны создавать несколько файлов.

Теперь, технически, это то, что делает команда: r, но вам может быть проще просто вставить команды непосредственно в файл вручную.

Также возможно, что это просто ошибка в дизайне DACCompiler.

Вот что я рекомендую вам сделать:

  • На данный момент самый простойЯ считаю, что нужно просто переместить сценарии прямо в папку Post-Deployment;дать им уникальные, описательные имена, чтобы компенсировать отсутствие подкаталогов.
  • В качестве альтернативы, если вы действительно хотите сохранить подкаталоги, добавьте команду pre-build в ваш проект;попросите его скопировать сценарии из подкаталогов в каталог после развертывания до начала сборки (вам необходимо убедиться, что сценарии имеют уникальные имена файлов)
  • Если вы считаете, что это ошибка или функция, котораядолжен существовать, перейдите на
    http://connect.microsoft.com/SQLServer и порекомендуйте команде продукта
    обратиться к нему в будущей версии продукта.Это отличное место для вынесения рекомендаций такого рода, поскольку обратная связь направляется команде разработчиков продукта, сообщество пользователей в целом может проголосовать за отзывы, чтобы увеличить их вес, а группа разработчиков продукта может сообщить вам информацию об отзывах.

И, конечно, вы могли бы подождать и посмотреть, есть ли у кого-то другой ответ, и если да, то отлично!Но я предполагаю, что если никто еще не ответил, то, вероятно, его нет;Я конечно не мог найти что-нибудь в моем копании.

Надеюсь, в целом эта информация полезна.Хотелось бы дать вам способ заставить его работать сейчас, но я думаю, что вам лучше всего работать в рамках ограничений текущего дизайна и оставлять отзывы в Connect.

Удачи.

0 голосов
/ 01 апреля 2016

Я только что попробовал это с помощью 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 вставляется в сгенерированный сценарий после развертывания.

Вот сгенерированный файл скрипта (только соответствующий раздел):

     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
0 голосов
/ 22 января 2013

У меня такое ощущение, что это будет слишком поздно, чтобы помочь с вашей проблемой, но это может стоить посмотреть. Формат dacpac - это просто zip-файл, содержащий серию XML-файлов и сценариев SQL. Если вы измените расширение файла на zip , вы сможете получить доступ к содержащимся в нем файлам. Файл postdeploy.sql должен содержать агрегирование вашего сценария пост-развертывания и всех других, на которые он ссылается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...