最近有朋友的SQL server數據庫意外中槍,幾經周折,數據將數據庫恢復到新環境。恢復后在數據庫級別有用戶名而實例級別則無相應的登陸用戶。這在SQL server數據庫中是一個比較普遍的情形。本文描述的是即是對這些孤立的賬戶通過系統過程sp_change_users_login來建立其映射關系。
1、sp_change_users_login的功能及其限制
使用 sp_change_users_login 將當前數據庫中的數據庫用戶鏈接到 SQL Server 登錄名。
如果用戶登錄名已更改,則使用 sp_change_users_login 將用戶鏈接到新的登錄,而不會丟失用戶的權限。
新的 login 不能為 sa,而 user 不能為 dbo、guest 或 INFORMATION_SCHEMA 用戶。
sp_change_users_login 不能用於將數據庫用戶映射到 Windows 級主體、證書或非對稱密鑰。
sp_change_users_login 不能與通過 Windows 主體創建的 SQL Server 登錄名一起使用,也不能與使用 CREATE USER WITHOUT LOGIN 創建的用戶一起使用。
不能在用戶定義的事務中執行 sp_change_users_login。
sp_change_users_login在后續的版本將會被ALTER USER取代。
2、sp_change_users_login語法參考
sp_change_users_login [ @Action = ] 'action'
[ , [ @UserNamePattern = ] 'user' ]
[ , [ @LoginName = ] 'login' ]
[ , [ @Password = ] 'password' ]
[;]
3、參數說明
[ @Action = ] 'action'
說明過程要執行的操作。action 的數據類型為 varchar(10)。action 可具有下列值之一。
值:Auto_Fix
將當前數據庫的 sys.database_principals 系統目錄視圖中的用戶項鏈接到同名的 SQL Server 登錄名。如果不存在同名的登錄名,將會創建一個。
檢查 Auto_Fix 語句的結果,確認實際鏈接是否正確。在對安全性較為敏感的情況下,要避免使用 Auto_Fix。
如果使用 Auto_Fix 時登錄名尚不存在,則必須指定 user 和 password,否則必須指定 user,但 password 將被忽略。login 必須為 NULL。
user 必須是當前數據庫中的有效用戶。不能將另一個用戶映射到該登錄名。
值:Report
列出當前數據庫中未鏈接到任何登錄名的用戶以及相應的安全標識符 (SID)。user、login 和 password 必須為 NULL 或不指定。
Update_One
將當前數據庫中的指定 user 鏈接到現有 SQL Server login。必須指定 user 和 login。password 必須為 NULL 或不指定。
[ @UserNamePattern = ] 'user'
當前數據庫中的用戶名。user 的數據類型為 sysname,默認值為 NULL。
[ @LoginName = ] 'login'
SQL Server 登錄的名稱。login 的數據類型為 sysname,默認值為 NULL。
[ @Password = ] 'password'
通過指定 Auto_Fix 創建的新 SQL Server 登錄名分配的密碼。如果已存在匹配的登錄名,則映射該用戶名與登錄名且忽略 password。
如果不存在匹配的登錄名,則 sp_change_users_login 創建新的 SQL Server 登錄名並分配 password 作為新登錄名的密碼。
password 的數據類型為 sysname,且不能為 NULL。
4、使用示例
a)、查找當前數據庫孤立用戶
exec sp_change_users_login 'REPORT'
UserName UserSID
---------- -----------------------
csidbo 0xAFEEF9DA1BA20E43AC8B01C69574F91B
b)、將孤立用戶映射到同名(不存在)的登陸名
-- 如下示例,將創建一個新的登陸名為csidbo,且設置密碼為xxx
-- 演示環境:Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1
-- Author : Leshami
-- Blog : http://www.linuxidc.com
USE crmnew;
GO
EXEC sp_change_users_login 'Auto_Fix', 'csidbo', NULL, 'xxx';
GO
c)、將數據庫用戶映射到已存在的SQL Server 登錄名
USE crmnew;
GO
EXEC sp_change_users_login 'Update_One', 'csidbo', 'csiuser'
GO