Восстановить имя пользователя базы данных на сервере в SQL Server 2008
У нас есть резервная копия базы данных, которую мы должны восстановить на сервере, на котором нет логинов для базы данных... хотя все пользователи находятся в базе данных, хотя мы надеемся, что сможем восстановить ее таким образом?
Я играл с sp_change_users_login, но он работает только с созданием новых пользователей или связыванием осиротевших пользователей базы данных с существующими пользователями сервера (несоответствующие SID, но с теми же именами пользователей).
Мне нужно создать логины сервера из пользовательской информации, хранящейся в базе данных.
6 ответов
Если ваша цель здесь состоит в том, чтобы воссоздать логины с тем же паролем, то вы - SOL, это сохраняется только в таблицах / представлениях в основной базе данных. Рекомендация Брайана сработает, если старый экземпляр все еще существует, но если нет, то вам нужно будет сделать один из вариантов ниже.
- Воссоздать логины
- Используйте sp_change_users_login для сопоставления пользователя базы данных с новым логином
или же
- Создать новые логины
- Назначьте права на этот логин в восстановленной базе данных
Обратите внимание, что это только в случае с логинами SQL, если вы используете логины Active Directory, все, что вам нужно сделать, это добавить их обратно на сервер, и они автоматически получат права в восстановленных базах данных, поскольку пароль и SID хранятся в AD а не в базе данных master для экземпляра.
Я не верю, что у вас достаточно информации о пользователях в базе данных для создания логинов. Информация, относящаяся к входу в систему, находится в базе данных master, тогда как информация о пользователе базы данных (включая сопоставления) находится в отдельных базах данных.
Если исходный сервер доступен, существует системная хранимая процедура sp_rev_login, которую вы можете создать из этой статьи поддержки Microsoft, в которой будет прописана информация для входа в систему, включая правильные идентификаторы безопасности. Затем вы можете согласовать логины с пользователями.
У меня есть хороший сценарий, который вы можете использовать для создания имен входа пользователей базы данных, этот сценарий использует хранимую процедуру, которую можно найти по следующему URL-адресу: Как создавать сценарии входа из базы данных пользователей в SQL Server 2005
USE MyDatabaseName
DECLARE @login nvarchar(50)
DECLARE logins_cursor CURSOR FOR
SELECT
l.name
FROM
sys.database_principals u INNER JOIN
sys.server_principals l ON u.sid=l.sid
OPEN logins_cursor
FETCH NEXT FROM logins_cursor INTO @login
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_help_revlogin @login
FETCH NEXT FROM logins_cursor INTO @login
END
CLOSE logins_cursor
DEALLOCATE logins_cursor
GO
Пытаться
EXEC sp_change_users_login 'Report'
EXEC sp_change_users_login 'AUTO_FIX', '<user name>', NULL, '<password>'
Где одно из имени пользователя, которое вы найдете в первом запросе, и новый пароль, который вы хотите назначить пользователю.
Я бессовестно перекладываю информацию, которую только что нашел на - http://tim-stanley.com/post/how-to-restore-a-sql-user-after-a-sql-database-restore/ думал, что это будет полезно для других.
Этот скрипт работал в моей БД
DECLARE @login nvarchar(50)
DECLARE logins_cursor CURSOR FOR
select master..syslogins.name as login_name
from master..syslogins
WHERE master..syslogins.name<>'BUILTIN\Administrators'
OPEN logins_cursor
FETCH NEXT FROM logins_cursor INTO @login
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC dbo.sp_change_users_login 'Auto_Fix' , @login
FETCH NEXT FROM logins_cursor INTO @login
END
CLOSE logins_cursor
DEALLOCATE logins_cursor
GO
select master..syslogins.name as login_name,
sysusers.name as user_name
from master..syslogins LEFT OUTER JOIN sysusers
on master..syslogins.suid = sysusers.suid
--ПРИМЕЧАНИЕ: используйте-> master..syslogins.sid = sysusers.sid в sql2000
Создайте логины и затем используйте:
ALTER USER usr1 WITH LOGIN = login1;