Вопрос по visual-studio-2010, sql-server – Проект базы данных Visual Studio: проверка, существует ли логин SQL-сервера перед его созданием

13

Когда я создаю проект базы данных Visual Studio для SQL 2012 и синхронизирую его с существующей базой данных (используя схему сравнения), я также синхронизирую вход на сервер SQL. Visual Studio генерирует следующий скрипт для входа в систему:

CREATE LOGIN [my_user] WITH PASSWORD = 'somesecurepass'

Когда я пытаюсь опубликовать сгенерированный SQL-запрос на сервере, где этот логин существует, sqlcmd показывает мне ошибку:

The server principal my_user already exists.

Когда я смотрю на сценарий sql, сгенерированный Visual Studio, я вижу, что многие объекты заключены в операторы IF EXISTS, но CREATE LOGIN не переносится!

Я пытался обернуть его вручную в сценарии SQL в проекте, но затем проект не создается, и возникает ошибка, указывающая на IF:

SQL70001: This statement is not recognized in this context.

Как теперь заставить Visual Studio сгенерировать сценарий создания входа с проверкой IF EXISTS, а также не потерять возможности синхронизации?

@ Nick.McDermaid - проблема в том, что он не находит логин, потому что Visual Studio генерирует скрипт развертывания, который даже не проверяет IF LOGIN EXISTS; он просто пытается его создать. Поэтому мне нужен был обходной путь. JustAMartin
@ abx78: да, я думал об этом, но затем мне придется перенести также фактическое создание пользователя базы данных для этого входа в систему перед развертыванием (если я не сделаю это, Visual Studio кричит мне, что my_db_user имеет плохой ссылка на этот логин my_user). Еще раз: если после развертывания проекта в базе данных кто-то запустит Schema Compare, эти логины и пользователи снова появятся в проекте, как они были изначально. JustAMartin
Как насчет удаления пользователя в сценарий перед развертыванием? просто предположение.. abx78
Я не понимаю, почему сравнение схем находит логин, если он уже существует в цели. Nick.McDermaid

Ваш Ответ

5   ответов
21

шает проблему.

Доступ к свойству действия сборки можно получить, щелкнув правой кнопкой мыши файл sql в обозревателе решений и выбрав Свойства. Или выделите файл в обозревателе решений и нажмите «F4».

это глупый ответ. Если мы сделаем это, этот файл не будет выполнен при публикации !!!!!!!!!!!!!!!!!!!! BJladu4
это фантастический ответ. Именно то, что я искал !!!!!!!!!!!!!!!!!!!!!!!!!!!!! Matt
@ BJladu4, вы можете запустить файл из другого файла sql, используя что-то вроде этого:r .\some-sql-file-set-to-none.sql. Кроме того, хорошо сыграно @Matt, ха-ха JohnnyFun
4

Полный ответ, вот что я сделал:

В Visual Studio щелкните правой кнопкой мыши сценарий входа или, в моем случае, сценарий связанного сервера. Клик Свойства. Под Расширенным ->Build Action, измените его с Build наНикт.

В вашем @ Перед развертывани script, добавьте строку для запуска этого скрипта. Для меня я переместил свой связанный серверный скрипт в ту же папку, что и скрипт PreDeployment. Тогда я могу просто сделать

:r .\linkedserver.sql

Когда вы развернете свой decpac, ваш скрипт входа в систему или скрипт связанного сервера будет успешно выполнен.
Спасибо Dongminator .. это действительно полная помощь, это спасло мою жизнь .. Bharat
1

правильно ли я понял вопрос, но я пришел сюда из-за похожего сценария. Потратив несколько часов с «если» и «попробуй поймать», вот мой ответ:

Смотря наDacPac исключает пользователей и логины при экспорте или импорте Я обнаружил, что должна быть опция исключить логины. Я обнаружил, что вы можете изменить опубликовать настройки для проекта базы данных, но эти настройки хранятся в файле * .user, который я обычно не помещаю в систему контроля версий. Глядя дальше, я нашел Параметры командной строки для 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.

0

и решение от меня было, чтобы сценарий перед развертыванием удалял пользователей:

IF EXISTS(SELECT TOP 1 1 FROM master.sys.server_principals WHERE name = 'my_user') BEGIN
   DROP LOGIN [my_user]
END

Проблема в том, что, возможно, вы изменили пароль, разрешения или настройкиLOGIN [my_user] поскольку он был создан, и после его удаления вы потеряете эти пользовательские настройки.

-1
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....

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

Да, я попробовал именно это. Он отлично работает, если используется в SQL Management Studio, но не работает при вводе в запрос в проекте базы данных Visual Studio. Это выдает ошибку (строка IF подчеркнута красным): SQL70001: Этот оператор не распознается в этом контексте. Очевидно, что проекты БД Visual Studio не допускают IFs вокруг CREATE ... JustAMartin
Сценарий правильный, но компилятору не нравится сценарий при попытке сборки. Просто щелкните правой кнопкой мыши файл сценария и выберите «Исключить из решения». Проект будет построен, и он найдет файл, когда ему еще нужно будет сослаться на него. Дайте мне знать, если это не приемлемое решение. danmanallen
@ danmanallen Не думаю, что ваше решение сработает при развертывании. abx78

Похожие вопросы