使用映射到 SQL Server 使用者/登錄名的 Active Directory 組的奇怪行為
我在 SQL Server 2008R2 上遇到了一個非常奇怪的行為。
我有一個充當 SQL Server 客戶端的第三方應用程序。我的一部分使用者應該有權訪問此應用程序。我創建了一個 Active Directory 組,稱為“DOM\appusers”,有幾個測試使用者。我創建了一個同名的 SQL Server 登錄名,創建了一個數據庫,將其命名為“appdb”,在 appdb 數據庫上創建了一個使用者“DOM\appusers”,與登錄名相關聯,並為該使用者分配了“db_owner”角色.
大多數操作都有效。但是其中“一些”會出錯。特別是,一個查詢失敗:
SELECT x,y,z INTO tmpTable FROM (table1 INNER JOIN table 2 on table1.col1 = table2.col1) INNER JOIN table3 ON table1.col2 = table3.col2 GROUP BY x,y,a,b,c HAVING (((table2.col4)=0) AND ((table3.col5)=0)) AND ((table3.col6)=0)
這是從 SQL Profiler 中提取出來的,它在其中將查詢標記為錯誤,但沒有關於錯誤的更多詳細資訊,並且應用程序沒有幫助,所以我無法準確告訴您引發了什麼錯誤。
我不是 SQL 專家,所以我不知道這個查詢有什麼特別之處,或者為什麼它需要 db_owner 之外的權限,但這並不是關於 SQL 查詢的真正問題。
對我來說真正奇怪的是,如果我繞過小組,我會得到不同的結果。如果我刪除了上面詳述的 SQL 伺服器登錄名和使用者,然後直接創建一個引用 Active Directory 使用者的新登錄名和使用者,並為其分配相同的 db_owner 角色,則上述查詢有效。事實上,所有查詢都按預期工作。
這很奇怪,我認為這一定是我的錯誤。我做了三遍同樣的實驗,結果都是一樣的。我驗證了測試使用者在沒有上述設置之一的情況下無法訪問數據庫。我嘗試將伺服器範圍的“sysadmin”角色分配給 AD 組,查詢開始工作。顯然,我不能這樣,但這是一個數據點。我還使用 SQL Server 身份驗證而不是 Windows 身份驗證創建了一個登錄名,這也很有效。
因此,顯而易見的問題是:當使用者通過組獲得權限與“直接”獲得權限時(就 MSSQL 的額外登錄和數據庫使用者層而言,任何東西都是“直接”的),權限有什麼不同?db_owner 對組和使用者的含義不同嗎?這只是一個錯誤嗎?有解決辦法嗎?我寧願不必將每個應用程序使用者單獨添加到 SQL Server 使用者/登錄列表中,但這是迄今為止我想到的唯一解決方法。有不同的解決方案嗎?
提前感謝您的幫助。:-)
事實證明,這並不完全是一個“權限”問題,儘管我收到了錯誤消息。
長話短說,與 Windows 組關聯的 SQL Server 使用者沒有預設架構,也無法配置。這是 SQL Server 2008R2(可能還有早期版本)的限制,已在 SQL Server 2012 中得到糾正。
因此,應用程序的查詢試圖在它沒有權限的模式中創建它的 tmpTable。當我創建連接到單個 Windows 使用者的 SQL Server 使用者時它起作用的原因是,在這種情況下,它分配了一個預設架構“dbo”,這是正確的架構。使用者有權在那裡寫信,一切正常。
最終,對我來說,唯一的解決方案是創建單獨的 SQL Server 使用者和連接到各個 Windows 帳戶的登錄名。這是一個持續的維護麻煩,但使用此版本的 SQL Server 似乎是不可避免的。