2010-10-18 43 views
7

我試圖從不同服務器中的備份恢復數據庫(SQL SERVER 2008)。我遇到的問題是登錄,因爲用戶包含在備份中,但登錄不是。恢復數據庫用戶登錄錯誤

所以我嘗試在服務器中創建一個新的登錄名,但它似乎沒有工作。

任何人都知道這個解決方法?

回答

2

如果您發佈了實際的錯誤消息以及產生錯誤的步驟,它將會非常有用。

無論如何,我認爲你需要做的是從恢復的數據庫中刪除用戶。然後你就可以從頭開始設置用戶&對應的服務器登錄。

編輯:

如果用戶在數據庫中擁有一個模式,你將無法刪除的用戶。 There is Microsoft article on how to transfer SQL Logins.

+0

好的,我設法通過更改模式來刪除用戶。所以我添加了一個新的登錄和用戶,但我仍然得到相同的錯誤:異常詳細信息:System.Data.SqlClient.SqlException:用戶'xx'的登錄失敗。 – user441365 2010-10-18 11:54:48

+0

我檢查了事件查看器和錯誤編號:1309 – user441365 2010-10-18 11:55:33

+0

@ user441365 - 查看此鏈接以獲取有關此錯誤的更多詳細信息。國家是什麼? http://msdn.microsoft.com/en-us/library/ms366351.aspx – codingbadger 2010-10-18 11:56:53

14

這是恢復後非常常見的問題。用戶(數據庫特定)和登錄(服務器範圍)都有一個SID。問題可能是您創建的登錄名與生產數據庫中的登錄名具有不同的SID。每次備份後

select UserSid from sysusers where name = 'UserName' 
select LoginSid from master.dbo.syslogins where name = 'UserName' 

下面是我們運行一個腳本來修復登錄 - 數據庫鏈接:您可以檢查登錄名和用戶的SID像

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 
+0

像魅力一樣工作,謝謝!這個腳本節省了我浪費時間的時間...... – DaveN59 2016-06-23 19:26:00

13

我不是100%肯定的原因你錯誤,但恢復時,從另一臺服務器的數據庫,假設登錄和用戶已經在目標服務器上存在此腳本可以幫助我:

EXEC sp_change_users_login UPDATE_ONE, '[username]', '[loginname]' 

(替代[用戶名]與您的數據庫用戶名一nd [登錄名]與服務器登錄)

-1

我無法對上述帖子發表評論 - 但它的工作原理,我必須做出的唯一修正是在LINE 4中,我在該字段上指定了默認排序。

JOIN master.dbo.syslogins l ON u.name COLLATE DATABASE_DEFAULT = l.name COLLATE DATABASE_DEFAULT