У нас есть резервная копия базы данных, которую нам нужно восстановить на сервере, на котором нет учетных записей для базы данных ... все пользователи находятся в базе данных, поэтому мы надеемся, что сможем восстановить ее таким образом?
Я играл с sp_change_users_login, но он работает только с созданием новых пользователей или связыванием осиротевших пользователей базы данных с существующими пользователями сервера (несоответствующие идентификаторы безопасности, но те же имена пользователей).
Мне нужно создать логины на сервере из информации о пользователе, хранящейся в базе данных.
Если ваша цель здесь - воссоздать логины с тем же паролем, тогда вы - SOL, он хранится только в таблицах / представлениях в базе данных master. Рекомендация Брайана будет работать, если старый экземпляр все еще существует, но в противном случае вам нужно будет выполнить один из вариантов ниже.
или
Обратите внимание, что это касается только учетных записей SQL, если вы используете учетные записи Active Directory, тогда все, что вам нужно сделать, это добавить их обратно на сервер, и они автоматически получат права в восстановленных базах данных, поскольку пароль и SID хранятся в AD. а не в базе данных master для экземпляра.
Я не верю, что у вас достаточно информации о пользователях в базе данных для создания логинов. Информация для входа в систему находится в главной базе данных, тогда как информация о пользователях базы данных (включая сопоставления) находится в отдельных базах данных.
Если исходный сервер доступен, существует системная хранимая процедура sp_rev_login, которую вы можете создать из этого Статья поддержки Microsoft который запишет информацию для входа в систему, включая правильные SID. Затем вы можете согласовать логины с пользователями.
У меня есть хороший скрипт, который вы можете использовать для создания логинов от пользователей базы данных, этот скрипт использует хранимую процедуру, которую вы можете найти по следующему 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
- ПРИМЕЧАНИЕ: use-> master..syslogins.sid = sysusers.sid в sql2000
Создайте логины, а затем используйте:
ALTER USER usr1 WITH LOGIN = login1;