SQL отображает логин для существующего пользователя
Недавно я обновил среду разработки с SQL 2000 до SQL 2008 R2. Я сделал резервную копию нашего производственного db и восстановил его наш новый сервер dev.
Я создал логин на dev-сервере, который отражает логин, который я использую на рабочем сервере, но я не могу его сопоставить с пользователем dbo в базе данных. Когда я изменяю свойства входа в "User Mapping", я заменяю пользователя "dbo", и я получаю следующую ошибку:
НАЗВАНИЕ: Microsoft SQL Server Management Studio Создает сбой для пользователя "ДБО. (Microsoft.SqlServer.Smo) Исключение произошло во время выполнение инструкции Transact-SQL или партии. (Microsoft.SqlServer.ConnectionInfo) Пользователь, группа или роль 'dbo' уже существует в текущей базе данных. (Microsoft SQL Server, ошибка: 15023)
Итак, как мне сопоставить логин с существующим пользователем?
Ответы
Ответ 1
Чтобы согласовать пользователя с логином, вы можете использовать хранимую процедуру системы sp_change_users_login.
sp_change_users_login [ @Action = ] 'action'
[ , [ @UserNamePattern = ] 'user' ]
[ , [ @LoginName = ] 'login' ]
[ , [ @Password = ] 'password' ];
Например:
EXEC sp_change_users_login 'Update_One','User123','User123'
Если у вас много пользователей, которые не синхронизированы, вы можете использовать курсор, чтобы вытащить всех пользователей и запустить для них эту команду. Нельзя отрицательно повлиять на работу с пользователями, которые не синхронизированы, и исправит всех потерянных пользователей.
DECLARE @sql NVARCHAR(MAX);
DECLARE curSQL CURSOR
FOR
SELECT 'EXEC sp_change_users_login ''UPDATE_ONE'', ''' + name + ''', ''' + name + ''''
FROM sysusers
WHERE issqluser = 1
AND name NOT IN ( 'guest', 'dbo', 'sys', 'INFORMATION_SCHEMA' )
OPEN curSQL
FETCH curSQL INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC (
@sql
)
FETCH curSQL INTO @sql
END
CLOSE curSQL
DEALLOCATE curSQL
Это должно быть выполнено в контексте базы данных, в которой должны быть исправлены пользователи.
Ответ 2
Я думаю, что комментарий Никола Марковиновича к этому сообщению нужно добавить в качестве ответа. Используйте команду пользователя Alter:
USE {database};
ALTER USER {user} WITH login = {login}
Где:
- {database}: база данных, содержащая пользователя-сироту
- {user}: имя пользователя-сироты
- {login}: имя входа. Вы можете использовать тот же логин, который используется на старом сервере, или сопоставить пользователя с другим именем входа.
Я нашел этот ответ на http://www.aip.im/2010/05/re-map-database-user-to-login-in-sql-server-after-restoring-or-attaching-database/#sthash.fbazv94Z.dpuf
Ответ 3
В SQL Server 2012 пользовательский "dbo" не может быть изменен.