Ian*_*ose 43 t-sql sql-server sql-server-2005
(注意这个问题询问关于链接所有用户,不同于要求链接单个用户的可能重复)
我希望在两台服务器之间移动一个数据库,我已经从第一台服务器上备份了数据库并在第二台服务器上完成了数据库恢复,到目前为止一直很好.
但是,我们的应用程序使用了数据库中定义的大量数据库用户.这些必须链接到master数据库中定义的登录.我已恢复数据库的服务器已定义所有登录,但它们具有不同的sid.
我不是T-SQL专家......
我认为sp_change_users_login是解决方案的一部分,但我无法找到如何让它自动将已恢复数据库中的所有用户链接到同名的登录名.
我们用于应用程序的数据库创建脚本创建用户和登录,但是在创建登录时它没有指定SID,因此出现此问题.现在如果我有时间机器......
(当我谷歌我得到很多点击,但他们大多是网站,不会让你看到答案,而不必先在网站上注册.)
PQW*_*PQW 41
是的,您可以通过执行以下操作来实现:
EXEC sp_change_users_login 'Auto_Fix' , 'TheUserName';
Run Code Online (Sandbox Code Playgroud)
但是,如果您的问题是我可以自动修复所有用户,那么这不会那样做.
Mik*_*Vee 27
我想出了以下内容.它工作得很好,因为它告诉你:
其他解决方案要求您事先知道孤立的用户名以便修复.
以下代码可以在将数据库还原到另一台服务器后调用的sproc中运行.
脚本:
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.
Run Code Online (Sandbox Code Playgroud)
结果:

*注意:未修复的4个(在上面的示例屏幕截图中)在目标服务器中没有相应的用户数据库已恢复到.
| 归档时间: |
|
| 查看次数: |
84097 次 |
| 最近记录: |