Sql-Server
Sql Server 修復使用者
我使用以下命令在我的數據庫中創建一個使用者:
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 忘記這些權限。