Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / DACPAK и добавление в таблицу столбца UNIQUE NOT NULL / 17 сообщений из 17, страница 1 из 1
20.12.2018, 09:00
    #39750590
Harlan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
В Визуальной студии создал проект "База данных" в котором описал структуру базы данных, в частности таблицу
Код: sql
1.
2.
3.
4.
5.
6.
table (
[id] INT NOT NULL, 
[value] NVARCHAR(255) NOT NULL, 
PRIMARY KEY ([id] ASC), 
UNIQUE ([name] ASC)
);

Собрал файл DACPAC и развернул его у клиентов. Всё было хорошо, пока не пришло постановление "сверху" добавить в эту таблицу ещё одно уникальное не пустое поле value2 со значениями [value] + ' ' + CAST([id] as nvarchar)
И вот тут у меня случился ступор: Сделать это скриптом, конечно, ничего не стоит, но как сделать это кошерно средствами MSVS?
Пробовал использовать скрипты predeploy или postdeploy, получаю либо ошибку, типа поле [value2] определяется дважды, либо в скрипте-описании вижу поле value2 nvarchar(max) NULL, которое уже в скрипте постразвёртывания заполняется и переопределяется в NOT NULL UNIQUE, что на мой взгляд - не совсем удачно.
Люди, подскажите, пожалуйста, как решить проблему грамотно?
А баги ползали и нагло шевелили усами... (с) Не моё.
...
Рейтинг: 0 / 0
20.12.2018, 09:27
    #39750601
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
HarlanПробовал использовать скрипты predeploy или postdeploy, получаю либо ошибку, типа поле [value2] определяется дважды, либо в скрипте-описании вижу поле value2 nvarchar(max) NULL, которое уже в скрипте постразвёртывания заполняется и переопределяется в NOT NULL UNIQUE, что на мой взгляд - не совсем удачно.
Люди, подскажите, пожалуйста, как решить проблему грамотно?Почему "не совсем удачно"?
Вручную, скриптом, вы это делали бы так же.
Только странно что nvarchar( max ), этот тип же нельзя сделать уникальным. Наверное, вы опечатались?
...
Рейтинг: 0 / 0
20.12.2018, 09:38
    #39750607
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
alexeyvgТолько странно что nvarchar( max ), этот тип же нельзя сделать уникальным. Наверное, вы опечатались?А где у него NVARCHAR(MAX)? Я вижу NVARCHAR(255).
И не вижу поля [name], по которому сделан UNIQUE
...
Рейтинг: 0 / 0
20.12.2018, 09:39
    #39750608
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
iapА где у него NVARCHAR(MAX)?О! В тексте нашёл value2 nvarchar(max).
Присоединяюсь к alexeyvg
...
Рейтинг: 0 / 0
20.12.2018, 10:44
    #39750634
Harlan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
alexeyvg, Да. Опечатка. NVARCHAR(255) поле [value], вместо [name] Пока писал вопрос, меня отвлекли на другую базу, вот и пошли ошибки. Прошу прощения.
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE [table] (
[id] INT NOT NULL, 
[value] NVARCHAR(255) NOT NULL, 
PRIMARY KEY ([id] ASC), 
UNIQUE ([value] ASC)
);
...
Рейтинг: 0 / 0
20.12.2018, 10:47
    #39750637
Harlan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
alexeyvgПочему "не совсем удачно"?
Потому, что в исходном скрипте создания таблицы, поле [value2] будет обозначено как NULL и NOT UNIQUE. Что затрудняет документирование.
...
Рейтинг: 0 / 0
20.12.2018, 11:11
    #39750652
Harlan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
Эщё один пример почему "не совсем удачно" относится к последующему обновлению структуры. Обновляемая структура будет содержать поле [value2] NOT NULL UNIQUE, Обновление структуры изначально вернёт его к NULL и NOT UNIQUE, а затем скрипт постустановки опять вернёт его к NOT NULL и UNIQUE. А можно вот этот онанизм как-то запретить? Например, проверять что если поле есть, то не менять его?
...
Рейтинг: 0 / 0
20.12.2018, 11:16
    #39750656
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
HarlanЭщё один пример почему "не совсем удачно" относится к последующему обновлению структуры. Обновляемая структура будет содержать поле [value2] NOT NULL UNIQUE, Обновление структуры изначально вернёт его к NULL и NOT UNIQUE, а затем скрипт постустановки опять вернёт его к NOT NULL и UNIQUE. А можно вот этот онанизм как-то запретить? Например, проверять что если поле есть, то не менять его?Это вот о чём вообще? Что куда вернёт и почему?
Разве вы не сами скрипт очередного обновления пишете?
...
Рейтинг: 0 / 0
20.12.2018, 12:54
    #39750747
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
Harlan,

так задайте по умолчанию значение [value] + ' ' + CAST([id] as nvarchar) для новой колонки.
...
Рейтинг: 0 / 0
21.12.2018, 07:15
    #39751121
Harlan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
iap, использование DACPAC и подразумевает, что в нём содержится описание структуры БД, а процесс обновления сам строит скрипты, которые будут клиентскую базу данных обновлять до актуальной. На сколько я смог разобраться в этом механизме, я могу описать два скрипта, которые будут исполняться или перед развёртыванием, или после развёртывания. Однако, свои скрипты обновления строятся до исполнения скрипта PREDEPLOY поэтому, если я добавлю поле в этом скрипте, то развёртывание свалится с ошибкой "Не может быть два поля с одинаковым именем", а если добавлю изменение поля в скрипт POSTDEPLOY, то основной скрипт сперва "перевернёт" поле в NULL NOT UNIQUE, а потом уже скрипт POSTDEPLOY вернёт этому полю атрибуты NOT NULL UNIQUE.
...
Рейтинг: 0 / 0
21.12.2018, 07:23
    #39751124
Harlan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
Владислав Колосов, пробовал, не прокатывает. Сообщение: "SQL70536: Имя "[value]" запрещено в данном контексте. К допустимым выражениям относятся константы, константные выражения и (в некоторых контекстах) переменные. Имена столбцов запрещены"
...
Рейтинг: 0 / 0
21.12.2018, 09:28
    #39751152
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
HarlanИ вот тут у меня случился ступор: Сделать это скриптом, конечно, ничего не стоит, но как сделать это кошерно средствами MSVS?За удобства надо платить. Жонглировать костылями- это нормально.
...
Рейтинг: 0 / 0
21.12.2018, 10:41
    #39751187
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
Harlan,

на 2 "деплоя" разбейте, всего-то делов...
...
Рейтинг: 0 / 0
21.12.2018, 12:37
    #39751249
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
HarlanalexeyvgПочему "не совсем удачно"?
Потому, что в исходном скрипте создания таблицы, поле [value2] будет обозначено как NULL и NOT UNIQUE. Что затрудняет документирование.В следующей версии сделаете NOT NULL и UNIQUE. Надеюсь, это то он переварит?
Хотя неудобно, конечно, и костыли, и все изменения от других разработчиков порушат продакшен. Так что в общем этот вариант отпадает.

Я, честно говоря, думал, что DACPAC не будет добавлять поле, если оно уже есть.

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

Я эту технологию не применял, когда она появилась, думал, что если допилят (что для МС эпохи "после Билла" маловероятно, но в сиквельной команде возможно), то буду.
Но увы, не допилили.

Тек что в студенческой лабе - велком, в проф работе не применяйте.
Используйте просто проект базы, все изменения делайте скриптами, сохраняемыми в том же проекте, время от времени используйте Compare, для сравнения проекта и базы.
...
Рейтинг: 0 / 0
23.12.2018, 10:23
    #39751807
Harlan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
Критик, замечательная идея.
Только никак не соображу, что писать в первом деплое, а что во втором? Не подскажете?
...
Рейтинг: 0 / 0
23.12.2018, 10:31
    #39751809
Harlan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
alexeyvg, у меня есть несколько клиентов, которые обновляют своё ПО когда угодно. Многие из этих клиентов из серии "Кто там? Сиди, я сам открою". Поэтому не хотелось бы им делать "сложные" инструкции с последовательными накатываниями пакетов. Но, видимо, другого варианта нет.
DACPAC не добавляет второе поле, если оно существовало до начала развёртывания. Но если началось развёртывание, то он сперва строит скрипт обновления исходя из того, что есть сейчас, потом уже выполняет скрипт predeploy. И если в этом скрипте есть код, который добавил это поле в таблицу, то основной код дакпака вылетит с ошибкой. Отсюда вывод: скрипт predeploy вынести за пределы dacpac. Т.е. сперва исполнить его, а потом уже развёртывать dacpac.
...
Рейтинг: 0 / 0
24.12.2018, 10:37
    #39752079
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DACPAK и добавление в таблицу столбца UNIQUE NOT NULL
HarlanDACPAC не добавляет второе поле, если оно существовало до начала развёртывания. Но если началось развёртывание, то он сперва строит скрипт обновления исходя из того, что есть сейчас, потом уже выполняет скрипт predeploy. И если в этом скрипте есть код, который добавил это поле в таблицу, то основной код дакпака вылетит с ошибкой. Отсюда вывод: скрипт predeploy вынести за пределы dacpac. Т.е. сперва исполнить его, а потом уже развёртывать dacpac.Вот как, спасибо.

Harlanalexeyvg, у меня есть несколько клиентов, которые обновляют своё ПО когда угодно. Многие из этих клиентов из серии "Кто там? Сиди, я сам открою". Поэтому не хотелось бы им делать "сложные" инструкции с последовательными накатываниями пакетов. Но, видимо, другого варианта нет.Другой вариант - не использовать DACPAC :-)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / DACPAK и добавление в таблицу столбца UNIQUE NOT NULL / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]