(请注意,此问题询问有关链接所有用户的问题,而不同于询问链接单个用户的可能重复问题)
我希望在两台服务器之间移动数据库,我已经从第一台服务器备份了数据库,并在第二台服务器上进行了数据库恢复,到目前为止一切顺利。
但是,我们的应用程序使用了大量在数据库中定义的数据库用户。这些必须链接到master数据库中定义的登录。我将数据库恢复到的服务器定义了所有登录,但是它们具有不同的sids。
我不是T-SQL专家…。
我认为sp_change_users_login
是解决方案的一部分,但我找不到如何让它自动将恢复的数据库中的所有用户链接到同名登录。
我们用于应用程序的数据库创建脚本创建用户和登录,但是它在创建登录时没有指定SID,因此出现了这个问题。如果我有一台时光机。
(当我在谷歌上搜索时,我得到了很多结果,但它们大多是不让你看到答案的网站,除非首先在网站上注册。)
发布于 2012-06-01 02:35:00
我想出了以下几点。它很好用,因为它向你展示了:
其他解决方案要求您事先知道孤立的用户名,以便修复。
以下代码可以在将数据库恢复到另一台服务器后调用的存储过程中运行。
脚本:
EXEC sp_change_users_login 'report'--See all orphaned users in the database.
DECLARE @OrphanedUsers TABLE
(
IndexKey Int IDENTITY(1,1) PRIMARY KEY,
UserName SysName,--nVarChar(128)
UserSID VarBinary(85)
)
INSERT INTO @OrphanedUsers
EXEC sp_change_users_login 'report'
DECLARE @CRLF as nVarChar
SET @CRLF = CHAR(10) + '&' + CHAR(13)--NOTE: Carriage-Return/Line-Feed will only appear in PRINT statements, not SELECT statements.
DECLARE @Sql as nVarChar(MAX)
SET @Sql = N''
DECLARE @IndexKey as Int
SET @IndexKey = 1
DECLARE @MaxIndexKey as Int
SET @MaxIndexKey = (SELECT COUNT(*) FROM @OrphanedUsers)
DECLARE @Count as Int
SET @Count = 0
DECLARE @UsersFixed as nVarChar(MAX)
SET @UsersFixed = N''
DECLARE @UserName as SysName--This is an orphaned Database user.
WHILE (@IndexKey <= @MaxIndexKey)
BEGIN
SET @UserName = (SELECT UserName FROM @OrphanedUsers WHERE IndexKey = @IndexKey)
IF 1 = (SELECT COUNT(*) FROM sys.server_principals WHERE Name = @UserName)--Look for a match in the Server Logins.
BEGIN
SET @Sql = @Sql + 'EXEC sp_change_users_login ''update_one'', [' + @UserName + '], [' + @UserName + ']' + @CRLF
SET @UsersFixed = @UsersFixed + @UserName + ', '
SET @Count = @Count + 1
END
SET @IndexKey = @IndexKey + 1
END
PRINT @Sql
EXEC sp_executesql @Sql
PRINT 'Total fixed: ' + CAST(@Count as VarChar) + '. Users Fixed: ' + @UsersFixed
SELECT ('Total fixed: ' + CAST(@Count as VarChar) + '. Users Fixed: ' + @UsersFixed)[Fixed]
EXEC sp_change_users_login 'report'--See all orphaned users still in the database.
结果:
*注意:未修复的4个(在上面的示例屏幕截图中)在数据库恢复到的目标服务器中没有对应的用户。
发布于 2009-05-15 10:55:57
是的,您可以通过执行以下命令来完成此操作:
EXEC sp_change_users_login 'Auto_Fix' , 'TheUserName';
但是,如果您的问题是我可以自动修复所有用户,那么这不会做到这一点。
发布于 2016-04-22 17:24:18
如果:
EXEC sp_change_users_login 'Auto_Fix' , 'TheUserName';
不起作用,试试这个:
EXEC sp_change_users_login 'Auto_Fix', 'Username', NULL, 'p@ssword123'
我在这里找到的:http://dbadiaries.com/using-sp_change_users_login-to-fix-sql-server-orphaned-users
https://stackoverflow.com/questions/867986
复制相似问题