我们使用SDK在CRM 2011中创建了一大堆用户。但是,我们通过数据库添加了他们的安全角色记录。
一切似乎都运行正常,直到这些用户开始保存自己的用户仪表板和高级查找。
用户可以创建自己的用户仪表板。然而,一旦他们创造了它们,他们就看不到它们了。它们不在他们的仪表板列表中 - 只有那里的系统仪表板。
事件查看器甚至跟踪日志中没有错误。
我使用SQL事件探查器查看它在做什么,我发现它正在检查PrincipalEntityMap表中是否有一个对象类型为1031的主体 - 这是用户仪表板(称为UserForm)。
如何创建这些记录?
我可以编写一个SQL脚本来填充这些缺失记录的数据库。
我想知道他们失踪的原因?有任何想法吗?
PrincipalEntityMap的记录来自哪里?
答案 0 :(得分:3)
因为我们通过数据库而不是通过SDK创建了UserRole(即用户安全角色)记录 - 我们错过了一些POA(主要对象访问)相关记录。 可以调用许多存储过程来重新初始化这些记录。 我们编写了一个脚本来为所有用户重置这些记录:
-- This will create PrincipalEntityMap for users - if they are not there:
INSERT INTO PrincipalEntityMap (ObjectTypeCode, PrincipalId, PrincipalEntityMapId)
SELECT 1031, sup.PrincipalId, NEWID()
FROM SystemUserPrincipals sup
INNER JOIN SystemUser su ON su.SystemUserId = sup.SystemUserId
WHERE
(sup.PrincipalId = su.SystemUserId) AND
(sup.PrincipalId NOT IN
(
SELECT pem.PrincipalId
FROM PrincipalEntityMap pem
WHERE pem.ObjectTypeCode = 1031
)
)
DECLARE @PrincipalTable TABLE (PrincipalID uniqueidentifier)
DECLARE @CurrentPrincipalID uniqueidentifier
DECLARE @UserIds VARCHAR(60)
DECLARE @Type INT
BEGIN TRANSACTION ResetPrincipalEntitiyMap
BEGIN
SET @Type = 8
INSERT INTO @PrincipalTable (PrincipalID)
SELECT sup.PrincipalId
FROM SystemUserPrincipals sup WITH (NOLOCK)
INNER JOIN SystemUser su WITH (NOLOCK) ON sup.SystemUserId = su.SystemUserId AND sup.PrincipalId = su.SystemUserId
WHILE EXISTS (SELECT PrincipalID FROM @PrincipalTable)
BEGIN
SELECT TOP 1 @CurrentPrincipalID = PrincipalID
FROM @PrincipalTable
ORDER BY PrincipalID ASC
EXEC p_PrincipalEntityMapReinit @CurrentPrincipalID, @Type
EXEC p_PrincipalAttributeAccessMapReinit @CurrentPrincipalID, @Type
SET @UserIds = cast(@CurrentPrincipalID AS VARCHAR(50))
EXEC p_SystemUserBuEntityMapReinit @UserIds
DELETE FROM @PrincipalTable WHERE PrincipalID = @CurrentPrincipalID
END
END
COMMIT TRANSACTION ResetPrincipalEntitiyMap
请注意:始终执行安全性的插入/更新/删除 通过相关实体(User,UserRole,Team,TeamRole等) SDK--而不是数据库。 SDK做了一些奇怪的事情 如果使用SQL,将会遗漏的背景。
答案 1 :(得分:1)
在尝试解决CRM 2013上的Exchange服务器端同步的常见/常见问题时(错误代码电子邮件服务器:Crm.80044151,当启用了联系人,任务和任命的同步时),我们也尝试过使用您的脚本重新启动主表
对于CRM2013 / 15,它必须稍微修改,因为SP p_PrincipalEntityMapReinit的签名已经改变。
这是更新的TSQL - 也许它可以帮助其他人(在我们的例子中,它没有:():
DECLARE @PrincipalTable dbo.EntityIdCollection
DECLARE @CurrentPrincipalID uniqueidentifier
DECLARE @UserIds VARCHAR(60)
DECLARE @Type INT
BEGIN TRANSACTION ResetPrincipalEntitiyMap
BEGIN
SET @Type = 8
INSERT INTO @PrincipalTable (id)
SELECT sup.PrincipalId
FROM SystemUserPrincipals sup WITH (NOLOCK)
INNER JOIN SystemUser su WITH (NOLOCK) ON sup.SystemUserId = su.SystemUserId AND sup.PrincipalId = su.SystemUserId
EXEC p_PrincipalEntityMapReinit @PrincipalTable, @Type
WHILE EXISTS (SELECT id FROM @PrincipalTable)
BEGIN
SELECT TOP 1 @CurrentPrincipalID = id
FROM @PrincipalTable
ORDER BY id ASC
EXEC p_PrincipalAttributeAccessMapReinit @CurrentPrincipalID, @Type, 1
SET @UserIds = cast(@CurrentPrincipalID AS VARCHAR(50))
EXEC p_SystemUserBuEntityMapReinit @UserIds
DELETE FROM @PrincipalTable WHERE id = @CurrentPrincipalID
END
END
COMMIT TRANSACTION ResetPrincipalEntitiyMap