系統目錄視圖和 sp_change_users_login 之間的差異?
我想檢查數據庫上的孤立使用者。為此,我在我的 SQL Server 2005 實例上使用以下查詢來獲取特定數據庫(例如MyDB)的所有使用者及其隨附的登錄名:
SELECT U.name AS UserName ,U.type_desc ,U.create_date ,U.modify_date ,U.default_schema_name ,P.name AS LoginName ,P.is_disabled ,P.type_desc ,P.default_database_name ,P.create_date ,P.modify_date FROM MyDB.sys.database_principals AS U LEFT OUTER JOIN master.sys.server_principals AS P ON U.sid = P.sid WHERE U.type IN ('G', 'S', 'U') ORDER BY UserName;
當我將此查詢的結果與
USE MyDB; EXEC sp_change_users_login @Action = 'Report';
事情的結果進行比較時,似乎並沒有加起來。第一個查詢給了我 12 個使用者,其中 6 個沒有登錄;但呼叫sp_change_users_login
只返回 1 個孤立使用者。即使我將guest、INFORMATION_SCHEMA和sys等使用者排除在外,在我的第一個查詢中仍然有兩個沒有登錄的使用者沒有出現在對
sp_change_users_login
. 我錯過了什麼?編輯根據方便的 MS Mapping System Tables to System Views文章(當然還有 Aaron),
我已將棄用的
sysuser
系統表的使用更改為系統視圖。database_principals
首先,
sp_change_users_login
不推薦使用的功能,在 SQL Server 2014 中已停止使用。其次,
EXEC sp_change_users_login @Action = 'Report'
不是獲取孤兒使用者列表的正確方法。與“報告”參數一樣,它將執行以下查詢。根據它,它將返回 issqluser = 1 的使用者(它必須是 SQl 伺服器登錄),如果孤立使用者是 NT 使用者而不是 SQL 使用者,則沒有結果。select UserName = name, UserSID = sid,* from sysusers where issqluser = 1 and (sid is not null and sid <> 0x0) and (len(sid) <= 16) and suser_sname(sid) is null order by name
根據BOL , “sp_change_users_login 不能與從 Windows 主體創建的 SQL Server 登錄或使用 CREATE USER WITHOUT LOGIN 創建的使用者一起使用。”
“ Mark Storey-Smith ” 已經提供了針對實例上的所有數據庫查找孤兒使用者的最佳腳本