Sql-Server-2005

系統目錄視圖和 sp_change_users_login 之間的差異?

  • November 28, 2014

我想檢查數據庫上的孤立使用者。為此,我在我的 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 個孤立使用者。

即使我將guestINFORMATION_SCHEMAsys等使用者排除在外,在我的第一個查詢中仍然有兩個沒有登錄的使用者沒有出現在對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 ” 已經提供了針對實例上的所有數據庫查找孤兒使用者的最佳腳本

查找孤立使用者

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