我正在尝试从其他服务器中的备份还原数据库(SQL SERVER 2008)。我遇到的问题是登录,因为用户包含在备份中,但登录不是。
所以我尝试在服务器中创建一个新的登录,但它似乎没有用。
有人知道解决方法吗?
答案 0 :(得分:14)
恢复后这是一个非常常见的问题。用户(特定于数据库)和登录(服务器范围)都具有SID。问题可能是您创建的登录与生产数据库上的登录具有不同的SID。您可以检查登录和用户SID,如:
select UserSid from sysusers where name = 'UserName'
select LoginSid from master.dbo.syslogins where name = 'UserName'
这是我们在每次备份后运行的脚本,用于修复登录 - 数据库链接:
declare user_cursor cursor forward_only read_only for
SELECT distinct u.name
FROM sysusers u
JOIN master.dbo.syslogins l ON u.name = l.name
WHERE u.issqluser <> 0
declare @user sysname;
open user_cursor
fetch next from user_cursor into @user;
while @@fetch_status = 0
begin
if @user <> 'dbo'
begin
print ''
print 'Updating user "' + @user + '"'
exec sp_change_users_login 'Auto_Fix', @user
end
fetch next from user_cursor into @user
end;
close user_cursor
deallocate user_cursor
答案 1 :(得分:13)
我不是100%确定您的错误原因但是这个脚本在从其他服务器恢复数据库时帮助我,假设登录和用户已经存在于目标服务器中:
EXEC sp_change_users_login UPDATE_ONE, '[username]', '[loginname]'
(用您的数据库用户名替换[username],用服务器登录替换[loginname])
答案 2 :(得分:3)
如果您发布了实际的错误消息以及产生错误所采取的步骤,那将非常有用。
无论如何,我认为您需要做的是从已恢复的数据库中删除用户。然后,您将能够设置用户&amp;相应的Server从头开始登录。
修改强>
如果用户拥有数据库中的架构,您将无法删除该用户。 There is Microsoft article on how to transfer SQL Logins.
答案 3 :(得分:-1)
我无法对上面的帖子发表评论 - 但它确实有效,我唯一要做的就是第4行,我在场上指定了默认的整理。
JOIN master.dbo.syslogins l ON u.name COLLATE DATABASE_DEFAULT = l.name COLLATE DATABASE_DEFAULT