Проект базы данных 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".


для всех, кто ищет полное ответ, вот что я сделал:

  1. в Visual Studio щелкните правой кнопкой мыши сценарий входа или, в моем случае, связанный сценарий сервера.
  2. клик свойства.
  3. В Разделе Advanced -> Создать Действие, измените его с Build на нет.
  4. в своем до развертывания script, добавьте строку для запуска этого скрипта. Ради себя я переехал. мой связанный сценарий сервера должен находиться в той же папке, что и сценарий перед развертыванием. Тогда я могу просто сделать

    :r .\linkedserver.sql

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