Dacpac не должен удалять лишние столбцы

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

Пока мы создаем таблицы, хранимые процедуры и различные другие артефакты базы данных, после развертывания у клиентов они могут добавлять свои собственные столбцы в таблицы, созданные нашим dacpac.

Мы используем DacFx для развертывания (Microsoft.SqlServer.Dac), а также предоставляем необработанный dacpac для клиентов, которые настаивают на развертывании их администраторами баз данных.

Хотя проблема все еще может присутствовать при использовании SSMS или подобных инструментов, я уверен, что с «правильным» кодом мы каким-то образом сможем предотвратить это при развертывании с помощью кода.

У кого-нибудь были такие же проблемы и, возможно, нашли решение?

Обновите, добавьте скриншот для настроек развертывания. Как видно на изображении, настройка «Отбрасывать объекты в цель, но не в проект» уже выключена.

Параметры развертывания


person Louis Lewis    schedule 17.06.2015    source источник
comment
Итак, точная проблема заключается в том, что клиент может создавать дополнительные столбцы, но когда вы развертываете свой DacPac, он удаляет эти столбцы?   -  person Nick.McDermaid    schedule 17.06.2015
comment
@Nick.McDermaid Это точная проблема, очень красиво сформулированная :)   -  person Louis Lewis    schedule 17.06.2015
comment
Привет, Луи, ты когда-нибудь нашел хорошее решение для этого? Мне также нужно иметь возможность развертывать и не удалять столбцы (из выбранных таблиц) при добавлении новых столбцов, которые были введены в проект базы данных.   -  person Simon Green    schedule 22.09.2015
comment
Привет @SimonGreen, у меня такая же проблема, ты нашел решение?   -  person Vinicius Gonçalves    schedule 01.07.2016
comment
Привет, я не нашел отличного решения, нет. Я написал модификатор, определяющий, есть ли в плане Alter Table Steps (в этом случае я их просто удаляю), или был ли использован SqlTableMigrationTStep, и в этом случае я должен удалить весь шаг, а затем добавить целую серию подпрограммы, позволяющие успешно завершить развертывание dacpac при удалении SqlMigrationStep... и, кроме того, я должен затем реализовать добавления и удаления столбцов, которые я хочу вручную, но выполняя старомодный скрипт, например "если не существует моего нового столбца, создайте его '...   -  person Simon Green    schedule 02.07.2016


Ответы (2)


Мне нравится это утверждение: «Я с радостью писал продукт, который использует проект базы данных Sql Server, и жизнь была хорошей» ха-ха!

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

Вы можете написать свой собственный или у меня есть тот, который должен это сделать (http://agilesqlclub.codeplex.com/), если вы используете мой, то это, вероятно, сработает для вас:

/p:AdditionalDeploymentContributorArguments="SqlPackageFilter=KeepType(.*Column.*)"

Если вы хотите написать свой собственный, вы можете использовать мой в качестве руководства (источник находится на codeplex) или см. http://blogs.msdn.com/b/ssdt/archive/2013/12/23/dacfx-public-model-tutorial.asp в частности «Решение 2: Фильтрация во время развертывания».

Ed

person Ed Elliott    schedule 30.06.2015
comment
Это действительно работает? Я не думаю, что столбцы являются типом, поэтому будет ли работать команда KeepType? - person Simon Green; 22.09.2015
comment
LOL, вы правы для изменения столбца, мы получаем ALTER в таблице, а не создание в таблице (тип столбца существует, мы просто его не видим) - я добавлю дополнительный тип фильтра, чтобы сохранить столбцы в таблицах поскольку я видел это несколько раз (и мне это понадобится в следующем проекте) :) - person Ed Elliott; 22.09.2015
comment
Привет, Эд, мне очень интересно, как ты здесь продвинулся. Я провел некоторое расследование и обнаружил, что DeploymentPlanModifier получает один AlterElementStep для таблицы, которая может содержать несколько добавлений и удалений столбцов для этой таблицы. Можно ли отфильтровать удаления, чтобы выполнялись только добавления столбцов? Нужно ли удалять AlterElementStep и заменять его новым (урезанным)? - person Simon Green; 23.09.2015
comment
Привет, Саймон, я выпустил новую версию, и вы правы в отношении AlterElementStep — полный отчет см. the.agilesql.club/blog/Ed-Elliott/2015/09/23/ — попробуйте и дайте мне знать, если это решает это для вас - person Ed Elliott; 23.09.2015
comment
Загрузите файл с agilesqlclub.codeplex.com/releases/view/617564 (версия › = 1.4.1) - person Ed Elliott; 23.09.2015
comment
Привет, Эд, только что кратко прочитал ваш блог, позже проверю код, но не уверен насчет решения № 1... если мы полностью проигнорируем шаг SqlTablemigration, мы обязательно избежим отбрасываемых столбцов, но не так ли? также пропустить какие-либо новые столбцы в dacpac? - person Simon Green; 24.09.2015
comment
Привет, Саймон, нет, я удаляю только капли, поэтому добавляются новые столбцы (хотя они добавляются в конце) - person Ed Elliott; 24.09.2015
comment
Эта новая версия работает для меня, я просто использую аргумент SqlPackageFilter=KeepTableColumns(Table1). Спасибо! - person Simon Green; 24.09.2015
comment
Хм, на самом деле нет, он немного сломан. Если в таблице нет строк, она работает. Однако если у него есть строки, AlterElementStep на самом деле является SqlTableMigrationStep. В этом случае он удаляет весь шаг из плана. Если у таблицы есть индексы, то последующий сценарий ожидает, что таблица будет удалена (вместе с ее индексами), а затем пытается воссоздать индексы. Но поскольку таблица никогда не удаляется, индексы по-прежнему существуют, и сценарий перестает работать, когда он все еще пытается воссоздать индексы. - person Simon Green; 25.09.2015
comment
Я был не совсем прав в одном: выбор использования SqlTableMigrationStep не связан с тем, есть ли строки или нет. Я вижу, как SqlTableMigrationStep используется в таблице без строк. Я не знаю, как он решает использовать SqlMigrationStep, но проблема остается: если он решит использовать его для таблицы с индексами, вы получите сообщение об ошибке. - person Simon Green; 25.09.2015
comment
... и то же самое относится к полнотекстовым индексам, а также к «обычным» индексам - person Simon Green; 25.09.2015
comment
Привет Саймон - я не могу воспроизвести это, также это довольно сложно отследить в комментариях здесь (и, вероятно, вопреки таким правилам) - можете ли вы указать подробности и, в идеале, образец сценария dacpac + ddl для его воспроизведения: agilesqlclub.codeplex.com/workitem/list/basic приветствует вас. - person Ed Elliott; 25.09.2015

Существует параметр «DropObjectsNotInSource», если он неверен, тогда столбцы останутся (но вам придется специально удалить другие объекты (скажем, после развертывания).

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

person Mark    schedule 17.06.2015
comment
Привет, Марк, мне жаль это говорить, но это не тот случай, когда я имел дело с этим. Этот параметр уже отключен, и я использую последнюю сборку. - person Louis Lewis; 17.06.2015
comment
Колонны не являются объектами, по крайней мере, с точки зрения Dacpac. Установка этого флага предотвратит удаление таблиц, представлений и т. д., но не столбцов. - person JamesQMurphy; 15.12.2016