將自定義 SQL Server 登錄添加到 Microsoft Dynamics CRM 4.0,得到空結果集
在工作中,我們安裝了 Microsoft Dynamics CRM 4.0,員工使用他們的 LAN 登錄來登錄 CRM 的 Web 界面。
我們使用 db_datareader 角色添加了一個基於 SQL Server 的自定義登錄(到伺服器和 db *_MSCRM)。新登錄名可以從視圖中進行選擇,但它會返回一個空的結果集。如果我使用我的 LAN ID 登錄 SQL Server Management Studio 並針對同一個視圖執行 sql,我會得到預期的數據。
任何想法有什麼遺漏或錯誤?
更新
我最終能夠繞過這個問題。問題是視圖後面的 sql 連結到一個自定義使用者表,這阻止了我的 sql 伺服器登錄返回任何數據,因為它不在這個自定義使用者表(SystemUserBase)中
left join SystemUserBase u on (u.SystemUserId = dbo.fn_FindUserGuid() and u.IsDisabled = 0) left join UserSettingsBase us on us.SystemUserId = u.SystemUserId left join OrganizationBase o on u.OrganizationId = o.OrganizationId
我猜微軟是這樣設計的,以便產品是自助服務的,而您不需要 DBA 來將使用者添加到數據庫。使用者通過應用程序進行管理。安全性是通過視圖強制執行的。
在任何情況下,我都可以通過傳遞我的 LAN ID 的 SystemUserId guid 來繞過它,同時作為通用 sql 登錄名登錄。有一個函式可以返回目前登錄的 LAN ID 的 guid:
print dbo.fn_FindUserGuid();
。然後我只執行了視圖 sql 的修改副本:declare @user_guid char(36); set @user_guid = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'; /* obfuscated */ ... left join SystemUserBase u on (u.SystemUserId = @user_guid and u.IsDisabled = 0) ...
我還必須刪除對通用登錄沒有執行權限的任何函式的任何引用(即
dbo.fn_UTCToTzSpecificLocalTime
)。或者我可以授予每個人的執行權。或者,我可能會調查在表中為我的通用登錄創建一個條目
SystemUserBase
,這樣我就不會被綁定到我的 LAN guid。更新 2
我能夠消除對 LAN guid (
SystemUserBase.SystemUserBase
) 的需要。我只是刪除了所有與權限相關的 where 子句。然後,StringMap 查找所需的只是OrganizationBase.OrganizationId
guid,OrganizationBase.LanguageCode
在我們的例子中是 en-us 或 1033。如果我不關心查找,我就不需要任何東西。我會直接反對錶而不使用 StringMaps 或權限 where 子句。
你的方法是錯誤的。
如果您想使用過濾視圖,您必須使用具有 CRM 帳戶的域使用者。應用程序在數據庫安全層之上有自己的安全層。因此,儘管您已授予使用者對數據庫本身的訪問權限,但應用程序將負責他的 CRM 權限的安全性。查看過濾視圖
篩選視圖完全符合 Microsoft Dynamics CRM 安全模型。當您執行從篩選視圖中獲取數據的報表時,Microsoft Dynamics CRM 安全形色確定您可以在報表中查看哪些數據。
請記住,在 Dynamics CRM 中,基本上唯一真正支持的直接數據庫訪問的使用是報告(這僅限於過濾視圖)。出於任何其他原因,您不應直接與數據庫互動。