Проект базы данных Visual Studio: проверка наличия имени входа SQL server перед его созданием
когда я создаю проект базы данных Visual Studio для SQL 2012 и синхронизирую его с существующей базой данных (используя схему сравнения), я также синхронизирую имя Входа SQL server. Visual Studio создает следующий сценарий для входа в систему:
CREATE LOGIN [my_user] WITH PASSWORD = 'somesecurepass'
когда я пытаюсь опубликовать сгенерированный SQL на сервере, где существует этот логин, sqlcmd показывает мне ошибку:
The server principal my_user already exists.
когда я смотрю на сценарий sql, созданный Visual Studio, я вижу, что многие объекты завернуты в IF Существуют операторы, но CREATE LOGIN не обернут!
Я попытался обернуть его вручную в SQL-скрипт в проекте, но тогда проект не строится, и есть ошибка, указывающая на IF:
SQL70001: This statement is not recognized in this context.
Теперь как заставить Visual Studio генерировать сценарий создания входа в систему с помощью проверки IF EXISTS, а также не терять возможности синхронизации?
5 ответов
измените свойство действия сборки файла сценария (*.sql) нет. Это решает проблему.
доступ к свойству действия сборки можно получить, щелкнув правой кнопкой мыши файл sql в обозревателе решений и выбрав пункт Свойства. Кроме того, выделите файл в обозревателе решений и нажмите клавишу "F4".
для всех, кто ищет полное ответ, вот что я сделал:
- в Visual Studio щелкните правой кнопкой мыши сценарий входа или, в моем случае, связанный сценарий сервера.
- клик свойства.
- В Разделе Advanced -> Создать Действие, измените его с Build на нет.
-
в своем до развертывания script, добавьте строку для запуска этого скрипта. Ради себя я переехал. мой связанный сценарий сервера должен находиться в той же папке, что и сценарий перед развертыванием. Тогда я могу просто сделать
:r .\linkedserver.sql
- при развертывании decpac сценарий входа в систему или сценарий связанного сервера будут успешно выполнены.
Не уверен, правильно ли я понимаю вопрос, но я пришел сюда из-за аналогичного сценария. Потратив несколько часов на "если" и "попробуйте поймать", вот мой ответ:
смотрим DacPac исключает пользователей и логины при экспорте или импорте я обнаружил, что должна быть опция исключить Логинов. Я обнаружил, что вы можете изменить "параметры публикации" для проекта базы данных, но эти параметры хранятся в *.пользовательский файл, который я обычно не ставьте в систему управления версиями. Посмотрев дальше, я нашел параметры командной строки для sqlpackage.exe https://blogs.msdn.microsoft.com/ssdt/2015/02/23/new-advanced-publish-options-to-specify-object-types-to-exclude-or-not-drop/ - ... Это, кажется, работает довольно хорошо, также учитывая, что вы можете получить sqlpackage.exe из NuGet (см. https://blogs.msdn.microsoft.com/ssdt/2016/08/22/releasing-ssdt-with-visual-studio-15-preview-4-and-introducing-ssdt-msbuild-nuget-package/) - ... Таким образом, нет ничего, чтобы построить на машине CI и развернуть результат на сервере.
редактировать: Это на VS2015 с соответствующим SSDT.
у меня точно такая же проблема и решение у меня было до развертывания скрипт удаления пользователей:
IF EXISTS(SELECT TOP 1 1 FROM master.sys.server_principals WHERE name = 'my_user') BEGIN
DROP LOGIN [my_user]
END
проблема в том, что, возможно, вы изменили пароль, разрешения или настройки LOGIN [my_user]
поскольку он был создан, и после его удаления и создания Вы потеряете эти настроенные параметры.
IF NOT EXISTS
(
SELECT [Column Name Where Username Is Stored]
FROM [Table Name That Holds The Login's]
WHERE name = 'my_user'
)
BEGIN
CREATE LOGIN [my_user] WITH PASSWORD = 'somesecurepass'
ELSE....
и затем вы можете написать оператор else для его обработки, однако вы хотите, чтобы это было обновление пароля до нового или просто возвращение сообщения о том, что пользователь уже существует. Дай мне знать,если тебе понадобится помощь в написании этой части.