Sql-Server

Sql Server 修復使用者

  • December 29, 2013

我使用以下命令在我的數據庫中創建一個使用者:

CREATE USER Test WITHOUT LOGIN

我使用測試名稱創建了一個登錄名。

我想將測試使用者與測試登錄連結。

當我使用以下命令時:

EXEC sp_change_users_login 'Update_One', 'Test', 'Test'

SQL Server 引發以下錯誤:

Msg 15291, Level 16, State 1, Procedure sp_change_users_login, Line 114
Terminating this procedure. The User name 'Test' is absent or invalid.

當我使用以下命令時:

ALTER USER Test WITH LOGIN = Test

SQL Server 引發波紋管錯誤:

Msg 33016, Level 16, State 1, Line 2
The user cannot be remapped to a login. Remapping can only be done for users that were mapped to Windows or SQL logins.

如何將測試使用者與測試登錄連結。

我創建此連結的目的:我想將數據庫從伺服器恢復到另一台伺服器,並在完成恢復後,在伺服器上使用現有登錄名映射使用者。

提前致謝。

WITHOUT LOGIN事後無法將顯式創建的使用者映射到登錄名。

使用登錄名創建的使用者然後失去其關聯,例如因為數據庫被移動到另一台伺服器,可以通過首先創建新登錄名(任何名稱)然後使用ALTER USER ... WITH LOGIN = ...命令來重新映射。

為了展示,我將創建一個數據庫tst,然後在其中創建一個登錄名tstlogin和關聯使用者:tstuser``tst

CREATE DATABASE tst;
GO
CREATE LOGIN tstlogin WITH PASSWORD = 'passw8rd';
GO
USE tst;
GO
CREATE USER tstuser FOR LOGIN tstlogin;

為了顯示正確的關聯,我們可以使用以下查詢:

SELECT DP.sid,DP.name user_name, SP.name login_name
FROM sys.database_principals AS DP
LEFT JOIN sys.server_principals AS SP
ON DP.sid = SP.sid
WHERE DP.name = 'tstuser';

這導致

SID                                        user_name      login_name
------------------------------------------ -------------- --------------
0xBF3D0CC874C72B469BEB4AA93845F59E         tstuser        tstlogin

現在我們將放棄登錄tstlogin

DROP LOGIN tstlogin;

並重新檢查我們的使用者:

SELECT DP.sid,DP.name user_name, SP.name login_name
FROM sys.database_principals AS DP
LEFT JOIN sys.server_principals AS SP
ON DP.sid = SP.sid
WHERE DP.name = 'tstuser';

它不再顯示關聯的登錄名:

SID                                        user_name      login_name
------------------------------------------ -------------- --------------
0xBF3D0CC874C72B469BEB4AA93845F59E         tstuser        NULL

下一步是創建一個新的登錄。(出於展示目的,我選擇了一個不同的名稱,但它也可以是相同的名稱。)

CREATE LOGIN tstlogin2 WITH PASSWORD = 'passw8rd';

要將新登錄名與我們的使用者相關聯,我們可以使用以下ALTER USER語句:

ALTER USER tstuser WITH LOGIN = tstlogin2;

再次檢查關聯:

SELECT DP.sid,DP.name user_name, SP.name login_name
FROM sys.database_principals AS DP
LEFT JOIN sys.server_principals AS SP
ON DP.sid = SP.sid
WHERE DP.name = 'tstuser';

說明ALTER語句成功:

SID                                        user_name      login_name
------------------------------------------ -------------- --------------
0xBF3D0CC874C72B469BEB4AA93845F59E         tstuser        tstlogin2

如果您確實需要將“ WITHOUT LOGIN”使用者更改為“使用登錄”使用者,則必須刪除該使用者並重新創建它。確保在這種情況下首先編寫權限腳本,因為刪除使用者會導致 SQL Server 忘記這些權限。

引用自:https://dba.stackexchange.com/questions/55769