向 Microsoft Dynamics CRM 4.0 添加了自定义 SQL Server 登录,获取空结果集

向 Microsoft Dynamics CRM 4.0 添加了自定义 SQL Server 登录,获取空结果集

在工作中,我们安装了 Microsoft Dynamics CRM 4.0,员工使用他们的 LAN 登录信息登录 CRM 的 Web 界面。

我们添加了一个基于 SQL Server 的自定义登录名(到服务器和数据库 *_MSCRM),其角色为 db_datareader。新登录名可以从视图中选择,但它返回一个空结果集。如果我使用我的 LAN ID 登录 SQL Server Management Studio 并针对同一视图运行 sql,我会得到预期的数据。

知道缺少了什么或者有什么错误吗?


更新

我最终能够规避这个问题。问题是视图背后的 SQL 链接到自定义用户表,这阻止我的 SQL Server 登录返回任何数据,因为它不在此自定义用户表 (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 指南。


更新2

我能够消除对 LAN guid ( SystemUserBase.SystemUserBase) 的需求。我只是删除了所有与权限相关的 where 子句。然后,StringMap 查找所需的只是 guid OrganizationBase.OrganizationId,而OrganizationBase.LanguageCodewhich 在我们的例子中是 en-us 或 1033。

如果我不在乎查找,我就不需要任何东西。我只需直接对照表格,而不需要 StringMaps 或权限 where 子句。

答案1

你的做法是错误的。

如果您想使用筛选视图,则必须使用具有 CRM 帐户的域用户。该应用程序在数据库安全层之上有自己的安全层。因此,尽管您已授予用户访问数据库本身的权限,但该应用程序将负责其 CRM 权限的安全性。请参阅筛选视图

筛选视图完全符合 Microsoft Dynamics CRM 安全模型。当您运行从筛选视图获取数据的报告时,Microsoft Dynamics CRM 安全角色将确定您可以在报告中查看哪些数据。

还请记住,基本上 Dynamics CRM 中唯一真正支持的直接数据库访问用途是报告(并且仅限于筛选视图)。您不应该出于任何其他原因直接与数据库交互。

答案2

要使用过滤视图,您需要在登录时设置 CRMReaderRole,然后在查询数据之前设置 CONTEXT_INFO

一次性设置

USE [CRM_MSCRM]
GO
EXEC sp_addrolemember N'CRMReaderRole', N'your sql login here'
GO

然后在查询过滤视图之前执行此操作

SELECT @uid = SystemUserId FROM CRM_MSCRM.dbo.SystemUserBase WHERE FullName = 'CRM USER TO IMPERSONATE' 
SET CONTEXT_INFO @uid

注意:这将适用于 SQL 用户,但不适用于链接服务器。已在 CRM 2011 UR 17 上测试

相关内容