В предыдущей статье мы обсудили потерянных пользователей и как их идентифицировать в SQL Server. В этой статье мы рассмотрим, как исправить потерянных пользователей.
Когда логин удаляется, связанный с ним пользователь в базе данных становится потерянным. Чтобы исправить это, мы можем удалить пользователя из базы данных с помощью следующего скрипта:
DROP USER Testwindows;
Однако иногда этот скрипт может вызвать ошибку, указывающую на то, что пользователь владеет схемой. Чтобы решить эту проблему, нам нужно найти схему, принадлежащую логину, путем запроса каталогового представления sys.schemas
и сопоставления principal_id
с sys.database_principals
. Затем мы можем либо удалить эти схемы, либо изменить владение в зависимости от нашей среды. Чтобы изменить владение схемой, мы можем использовать следующую команду:
ALTER AUTHORIZATION ON SCHEMA::SchemaName TO NewUserName;
В ситуациях, когда база данных восстанавливается в другой среде, мы можем столкнуться с несоответствием SID между sys.server_principals
и sys.database_principals
. Чтобы исправить эту проблему, мы можем использовать системную хранимую процедуру sp_change_users_login
. Например, если у нас есть логин Mydomain\Lastname.Firstname
, связанный с пользователем TestWindowsUser
с правами db_owner
на базу данных (MyDb
) в одном экземпляре (INST1
), и мы восстанавливаем базу данных на другом экземпляре (INST2
), логин не сможет получить доступ к восстановленной базе данных, так как его SID не совпадает с SID в sys.server_principals
.
Чтобы исправить это, мы можем выполнить следующую команду на восстановленной базе данных:
USE MyDb;
GO
EXEC sp_change_users_login 'update_one', 'TestWindowsUser', 'Mydomain\Lastname.Firstname';
Примечание: Процедура sp_change_users_login
является устаревшей функцией в SQL Server 2008. Вместо этого вы можете использовать оператор ALTER USER
, как показано ниже:
ALTER USER TestWindowsUser WITH LOGIN [Mydomain\Lastname.Firstname];
Следуя этим шагам, вы успешно исправите потерянных пользователей в SQL Server.
Если вам понравилась эта статья, пожалуйста, поставьте лайк на нашей странице в Facebook по адресу www.PracticalSqlDba.com.