Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
Harlan
Member

Откуда: Новосибирск
Сообщений: 72
В Визуальной студии создал проект "База данных" в котором описал структуру базы данных, в частности таблицу
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, что на мой взгляд - не совсем удачно.
Люди, подскажите, пожалуйста, как решить проблему грамотно?
А баги ползали и нагло шевелили усами... (с) Не моё.
20 дек 18, 09:00    [21769139]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30800
Harlan
Пробовал использовать скрипты predeploy или postdeploy, получаю либо ошибку, типа поле [value2] определяется дважды, либо в скрипте-описании вижу поле value2 nvarchar(max) NULL, которое уже в скрипте постразвёртывания заполняется и переопределяется в NOT NULL UNIQUE, что на мой взгляд - не совсем удачно.
Люди, подскажите, пожалуйста, как решить проблему грамотно?
Почему "не совсем удачно"?
Вручную, скриптом, вы это делали бы так же.
Только странно что nvarchar(max), этот тип же нельзя сделать уникальным. Наверное, вы опечатались?
20 дек 18, 09:27    [21769155]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
alexeyvg
Только странно что nvarchar(max), этот тип же нельзя сделать уникальным. Наверное, вы опечатались?
А где у него NVARCHAR(MAX)? Я вижу NVARCHAR(255).
И не вижу поля [name], по которому сделан UNIQUE
20 дек 18, 09:38    [21769170]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
iap
А где у него NVARCHAR(MAX)?
О! В тексте нашёл value2 nvarchar(max).
Присоединяюсь к alexeyvg
20 дек 18, 09:39    [21769171]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
Harlan
Member

Откуда: Новосибирск
Сообщений: 72
alexeyvg, Да. Опечатка. NVARCHAR(255) поле [value], вместо [name] Пока писал вопрос, меня отвлекли на другую базу, вот и пошли ошибки. Прошу прощения.
CREATE TABLE [table] (
[id] INT NOT NULL, 
[value] NVARCHAR(255) NOT NULL, 
PRIMARY KEY ([id] ASC), 
UNIQUE ([value] ASC)
);
20 дек 18, 10:44    [21769227]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
Harlan
Member

Откуда: Новосибирск
Сообщений: 72
alexeyvg
Почему "не совсем удачно"?

Потому, что в исходном скрипте создания таблицы, поле [value2] будет обозначено как NULL и NOT UNIQUE. Что затрудняет документирование.
20 дек 18, 10:47    [21769231]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
Harlan
Member

Откуда: Новосибирск
Сообщений: 72
Эщё один пример почему "не совсем удачно" относится к последующему обновлению структуры. Обновляемая структура будет содержать поле [value2] NOT NULL UNIQUE, Обновление структуры изначально вернёт его к NULL и NOT UNIQUE, а затем скрипт постустановки опять вернёт его к NOT NULL и UNIQUE. А можно вот этот онанизм как-то запретить? Например, проверять что если поле есть, то не менять его?
20 дек 18, 11:11    [21769259]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
Harlan
Эщё один пример почему "не совсем удачно" относится к последующему обновлению структуры. Обновляемая структура будет содержать поле [value2] NOT NULL UNIQUE, Обновление структуры изначально вернёт его к NULL и NOT UNIQUE, а затем скрипт постустановки опять вернёт его к NOT NULL и UNIQUE. А можно вот этот онанизм как-то запретить? Например, проверять что если поле есть, то не менять его?
Это вот о чём вообще? Что куда вернёт и почему?
Разве вы не сами скрипт очередного обновления пишете?
20 дек 18, 11:16    [21769264]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7399
Harlan,

так задайте по умолчанию значение [value] + ' ' + CAST([id] as nvarchar) для новой колонки.
20 дек 18, 12:54    [21769404]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
Harlan
Member

Откуда: Новосибирск
Сообщений: 72
iap, использование DACPAC и подразумевает, что в нём содержится описание структуры БД, а процесс обновления сам строит скрипты, которые будут клиентскую базу данных обновлять до актуальной. На сколько я смог разобраться в этом механизме, я могу описать два скрипта, которые будут исполняться или перед развёртыванием, или после развёртывания. Однако, свои скрипты обновления строятся до исполнения скрипта PREDEPLOY поэтому, если я добавлю поле в этом скрипте, то развёртывание свалится с ошибкой "Не может быть два поля с одинаковым именем", а если добавлю изменение поля в скрипт POSTDEPLOY, то основной скрипт сперва "перевернёт" поле в NULL NOT UNIQUE, а потом уже скрипт POSTDEPLOY вернёт этому полю атрибуты NOT NULL UNIQUE.
21 дек 18, 07:15    [21770195]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
Harlan
Member

Откуда: Новосибирск
Сообщений: 72
Владислав Колосов, пробовал, не прокатывает. Сообщение: "SQL70536: Имя "[value]" запрещено в данном контексте. К допустимым выражениям относятся константы, константные выражения и (в некоторых контекстах) переменные. Имена столбцов запрещены"
21 дек 18, 07:23    [21770198]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
tunknown
Member

Откуда:
Сообщений: 748
Harlan
И вот тут у меня случился ступор: Сделать это скриптом, конечно, ничего не стоит, но как сделать это кошерно средствами MSVS?
За удобства надо платить. Жонглировать костылями- это нормально.
21 дек 18, 09:28    [21770235]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33264
Блог
Harlan,

на 2 "деплоя" разбейте, всего-то делов...
21 дек 18, 10:41    [21770287]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30800
Harlan
alexeyvg
Почему "не совсем удачно"?

Потому, что в исходном скрипте создания таблицы, поле [value2] будет обозначено как NULL и NOT UNIQUE. Что затрудняет документирование.
В следующей версии сделаете NOT NULL и UNIQUE. Надеюсь, это то он переварит?
Хотя неудобно, конечно, и костыли, и все изменения от других разработчиков порушат продакшен. Так что в общем этот вариант отпадает.

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

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

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

Тек что в студенческой лабе - велком, в проф работе не применяйте.
Используйте просто проект базы, все изменения делайте скриптами, сохраняемыми в том же проекте, время от времени используйте Compare, для сравнения проекта и базы.
21 дек 18, 12:37    [21770371]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
Harlan
Member

Откуда: Новосибирск
Сообщений: 72
Критик, замечательная идея.
Только никак не соображу, что писать в первом деплое, а что во втором? Не подскажете?
23 дек 18, 10:23    [21771299]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
Harlan
Member

Откуда: Новосибирск
Сообщений: 72
alexeyvg, у меня есть несколько клиентов, которые обновляют своё ПО когда угодно. Многие из этих клиентов из серии "Кто там? Сиди, я сам открою". Поэтому не хотелось бы им делать "сложные" инструкции с последовательными накатываниями пакетов. Но, видимо, другого варианта нет.
DACPAC не добавляет второе поле, если оно существовало до начала развёртывания. Но если началось развёртывание, то он сперва строит скрипт обновления исходя из того, что есть сейчас, потом уже выполняет скрипт predeploy. И если в этом скрипте есть код, который добавил это поле в таблицу, то основной код дакпака вылетит с ошибкой. Отсюда вывод: скрипт predeploy вынести за пределы dacpac. Т.е. сперва исполнить его, а потом уже развёртывать dacpac.
23 дек 18, 10:31    [21771301]     Ответить | Цитировать Сообщить модератору
 Re: DACPAK и добавление в таблицу столбца UNIQUE NOT NULL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30800
Harlan
DACPAC не добавляет второе поле, если оно существовало до начала развёртывания. Но если началось развёртывание, то он сперва строит скрипт обновления исходя из того, что есть сейчас, потом уже выполняет скрипт predeploy. И если в этом скрипте есть код, который добавил это поле в таблицу, то основной код дакпака вылетит с ошибкой. Отсюда вывод: скрипт predeploy вынести за пределы dacpac. Т.е. сперва исполнить его, а потом уже развёртывать dacpac.
Вот как, спасибо.

Harlan
alexeyvg, у меня есть несколько клиентов, которые обновляют своё ПО когда угодно. Многие из этих клиентов из серии "Кто там? Сиди, я сам открою". Поэтому не хотелось бы им делать "сложные" инструкции с последовательными накатываниями пакетов. Но, видимо, другого варианта нет.
Другой вариант - не использовать DACPAC :-)
24 дек 18, 10:37    [21771811]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить