2014-08-28 66 views
2

我們使用SDK在CRM 2011中創建了一羣用戶。但是,我們通過數據庫添加了他們的安全角色記錄。CRM 2011:用戶缺少特殊權限

似乎一切正常,直到這些用戶開始保存自己的用戶儀表板和高級查找。

用戶可以創建自己的用戶儀表板。但是,一旦他們創造了他們,他們就看不到他們。他們不在他們的儀表板列表中 - 只有那裏的系統儀表板。

事件查看器或甚至跟蹤日誌中沒有錯誤。

我使用SQL事件探查器來查看它在做什麼,並且我發現它正在檢查PrincipalEntityMap表中的對象類型爲1031的用戶儀表板(稱爲UserForm)。

這些記錄是如何創建的?

我可以編寫一個SQL腳本來填充這些缺失記錄的數據庫。

我想知道他們爲什麼失蹤?有任何想法嗎?

PrincipalEntityMap的記錄來自哪裏?

回答

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 

請注意:一定要進行插入/更新/安全 的刪除相關實體(用戶,UserRole的,團隊,TeamRole等)通過 SDK - 而不是數據庫。 SDK會在 背景中做一些奇怪的事情,如果您使用SQL,將會錯過。

1

嘗試解析對CRM 2013與Exchange服務器方同步通用/恆問題(錯誤代碼E-郵件服務器:Crm.80044151時的聯繫人,任務和appoitments同步功能),我們已經還嘗試使用腳本重新創建主體表。
對於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 
相關問題