У меня возникла проблема в SSMS версий 14, 18 и 19, из-за которой загрузка сопоставления пользователей для любого заданного имени входа занимает много времени, иногда до часа, или просто никогда не загружается вообще и не отвечает.
Кто-нибудь сталкивался с этим раньше и/или мог дать какие-либо рекомендации по решению этой проблемы?
Я пробовал следующее:
К сожалению, эта проблема невероятно затрудняет управление безопасностью пользователей и сопоставлением баз данных без написания SQL-запроса.
Любая поддержка или руководство будут оценены по достоинству!
РЕДАКТИРОВАТЬ. Я запустил трассировку SQL и определил следующий запрос как нарушителя:
USE [database_name]
SELECT
u.name AS [Name],
CAST(CASE dp.state WHEN N'G' THEN 1 WHEN 'W' THEN 1 ELSE 0 END AS bit) AS [HasDBAccess],
ISNULL(u.default_schema_name,N'') AS [DefaultSchema]
FROM
sys.database_principals AS u
LEFT OUTER JOIN sys.database_permissions AS dp ON dp.grantee_principal_id = u.principal_id
and dp.type = @_msparam_0
WHERE
(u.type in ('U', 'S', 'G', 'C', 'K' ,'E', 'X'))
and
(ISNULL(suser_sname(u.sid),N'')=@_msparam_1)
Он запускается после выбора БД для запуска и является четвертым запросом для запуска.
РЕДАКТИРОВАТЬ 2. Именно эта часть вызывает проблему, и я понятия не имею, почему:
and
(ISNULL(suser_sname(u.sid),N'''')=@_msparam_1)
РЕДАКТИРОВАТЬ 3. Я почти уверен, что это функция «suser_sname», протестировав ее на разных БД и разных логинах. Он просто зависает и никогда не завершается, вынуждая меня закрыть SQL.
Любые дальнейшие рекомендации будут оценены по достоинству, спасибо.
РЕДАКТИРОВАТЬ 4. Дальнейший контекст, извините за первоначальное исключение этой информации.
Эта проблема возникает в отдельном домене — нашей среде разработки. Именно здесь восстанавливаются наши производственные базы данных, и в рамках этого восстановления соответствующие учетные записи SQL обновляются для работы в домене DEV, где это необходимо.
Я задавался вопросом, возможно, некоторые потерянные учетные записи SQL вызывали эту проблему из-за некоторого несоответствия SID в sys.database_principals. Да, были некоторые потерянные учетные записи, но после их исправления с помощью sp_change_users_login эта проблема все еще возникает.
Вопросы @siggemannen были дополнены оскорбительными запросами. Я сейчас разбираю его и пытаюсь определить, в чем именно проблема.





TL;DR. Убедитесь, что у вас есть надежная очистка пользователя/логина при восстановлении базы данных из одного домена Windows в другой!!
Полный ответ: Как уже упоминалось в моем вопросе, проблема связана с нашей средой DEV, где базы данных восстанавливаются из нашей среды PROD.
Когда мы это делаем, мы запускаем сценарий обновления, который обновляет пользователей и входы в конкретную среду Windows. Например. PROD\L.Moy становится DEV\L.Moy при обновлении с домена Prod на домен Dev.
Этот сценарий обновления НЕ учитывает и не удаляет ненужных пользователей и логины. Необязательный пользователь и логин по-прежнему содержали свой домен PROD как часть имени пользователя Windows. Например. в нашем DEV SQL-сервере вы все равно можете найти пользователя PROD\foobar в качестве пользователя в БД, хотя он и не нужен.
Для меня это означало, что у меня было около 40 пользователей PROD Windows SQL против 25 БД, которые НЕ требовались для нашей среды разработки.
Итак, учитывая вышеизложенное, когда вы нажимаете «Сопоставление пользователей» напротив имени входа, запускается системная функция под названием «SUSER_SNAME». Когда я запускал эту функцию специально для SID для пользователей PROD и логинов в нашей среде DEV, на каждый из них ушло чуть больше минуты. Если вы запустите «SUSER_SNAME» с SID для входа, который должен находиться в DEV, он завершится немедленно.
Таким образом, решение здесь заключалось в том, чтобы фактически очистить все имена входа и пользователей, которые на самом деле не были нужны, из всех БД в среде DEV.
Затем при выборе «Сопоставление пользователей» для входа в систему он завершается немедленно, без каких-либо проблем с производительностью.
Спасибо @Stephen Morris - Mo64 за советы и предложения.
Можете ли вы отследить, какие запросы выполняет SSMS при загрузке сопоставлений пользователей?