SQL Server 錯誤:15023(創建對於用戶失敗)——孤立用戶故障排除


問題:

錯誤15023:當前數據庫中已存在用戶或角色

在把遠程服務器上的數據庫備份還原到本地機后, 給一個"登錄"關聯一個"用戶"時(用戶映射),發生錯誤:“錯誤15023:當前數據庫中已存在用戶或角色”

原因:

SQL Server中“登錄”與“用戶”的區別,“登錄”用於用戶身份驗證,而數據庫“用戶”帳戶用於數據庫訪問和權限驗證。登錄通過安全識別符 (SID) 與用戶關聯。

將數據庫恢復到其他服務器時,數據庫中包含一組用戶和權限,但可能沒有相應的登錄或者登錄所關聯的用戶可能不是相同的用戶。這種情況被稱為存在“孤立用戶”。

此時是不能通過新建登錄或者是對同名登錄授予對應數據庫的“用戶”權限來解決登錄問題,因為SQL Server會報出“錯誤15023:當前數據庫中已存在用戶或角色”

 

解決:

為了解決這個問題,需要調用系統存儲過程sp_change_users_login,具體用法如下:

Use Northwind
Go
sp_change_users_login 'update_one', 'test', 'test'

其中Northwind為存在孤立用戶的數據庫,update_one是存儲過程的參數,表示只處理一個用戶,前一個test是“用戶”,后一個test是“登錄”,

以上這個SQL表示將服務器登錄“test”與 Northwind 數據庫用戶“test”重新連接起來。這樣就可以正常使用數據庫了。

如果有如下提示:

 

提示“消息 15063,級別 16,狀態 1,過程 sp_change_users_login,第 143 行,該登錄已用另一個用戶名開立帳戶”。

原來該數據的所有者是test,執行sp_changedbowner 'sa'。

 

一次排除當前庫中所有孤立用戶存儲過程:

原因:

SQL Server中“登錄”與“用戶”的區別,“登錄”用於用戶身份驗證,而數據庫“用戶”帳戶用於數據庫訪問和權限驗證。登錄通過安全識別符 (SID) 與用戶關聯。

將數據庫恢復到其他服務器時,數據庫中包含一組用戶和權限,但可能沒有相應的登錄或者登錄所關聯的用戶可能不是相同的用戶。這種情況被稱為存在“孤立用戶”。

此時是不能通過新建登錄或者是對同名登錄授予對應數據庫的“用戶”權限來解決登錄問題,因為SQL Server會報出“錯誤15023:當前數據庫中已存在用戶或角色”

 

解決:

為了解決這個問題,需要調用系統存儲過程sp_change_users_login,具體用法如下:

Use Northwind
Go
sp_change_users_login 'update_one', 'test', 'test'

其中Northwind為存在孤立用戶的數據庫,update_one是存儲過程的參數,表示只處理一個用戶,前一個test是“用戶”,后一個test是“登錄”,

以上這個SQL表示將服務器登錄“test”與 Northwind 數據庫用戶“test”重新連接起來。這樣就可以正常使用數據庫了。

如果有如下提示:

 

提示“消息 15063,級別 16,狀態 1,過程 sp_change_users_login,第 143 行,該登錄已用另一個用戶名開立帳戶”。

原來該數據的所有者是test,執行sp_changedbowner 'sa'。

 

一次排除當前庫中所有孤立用戶存儲過程:

 1 DECLARE @username NVARCHAR(50)  
 2   
 3 CREATE TABLE #temp_user  
 4   (  
 5      username NVARCHAR(50),  
 6      UserSID  INT  
 7   )  
 8   
 9 INSERT INTO #temp_user  
10 EXEC Sp_change_users_login @Action='Report'  
11   
12 DECLARE temp_cursor CURSOR FOR  
13   SELECT username  
14   FROM   #temp_user  
15   
16 OPEN temp_cursor  
17   
18 FETCH NEXT FROM temp_cursor INTO @username  
19   
20 WHILE ( @@FETCH_STATUS = 0 )  
21   BEGIN  
22       EXEC Sp_change_users_login  
23         'Auto_Fix',  
24         @username,  
25         NULL,  
26         @username;  
27   
28       EXEC Sp_change_users_login  
29         @Action='update_one',  
30         @UserNamePattern=@username,  
31         @LoginName=@username;  
32   END  
33   
34 CLOSE temp_cursor  
35   
36 DEALLOCATE temp_cursor  
37   
38 DROP TABLE #temp_user   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM