导航

CRM PrincipalObjectAccess(POA)

Posted on 2016-08-29 23:16  yiyishuitian  阅读(632)  评论(0编辑  收藏  举报

PrincipalObjectAccess (POA) table is an important table which holds all grants share on CRM objects. This is just for understanding purpose.

 

SELECT TOP 100
 [PrincipalObjectAccessId]
 ,[PrincipalId]
 ,[PrincipalTypeCode]
 ,[ObjectId]
 ,[ObjectTypeCode]
 ,[AccessRightsMask]
 ,[InheritedAccessRightsMask]
FROM
 [PrincipalObjectAccess] WITH (NOLOCK)

 

PrincipalObjectAccessId – The GUID of share record.
PrincipalId – The GUID of the User or Team receiving the Share.
PrincipalTypeCode – indicates whether it’s a User or Team. -- 8 user 9 team
ObjectId – The GUID of the specific object being shared.
ObjectTypeCode – The object type of the record being shared.
AccessRightsMask – This field stores the rights granted directly via the ‘Sharing’ dialog.
InheritedAccessRightsMask – The rights applied by the system through cascading or reassignment processes are stored in this field.

check microsoft query to control this table data..

 

 

InheritedAccessRightsMask – The rights applied by the system through cascading or reassignment processes are stored in this field.

1 User

2 Business Unit

4 Parent: Child

8 Organization


Decoding the RightsMask Fields (AccessRightsMask and InheritedAccessRightsMask)

0               No permission
1                  Read
2                  Write
4                  Append
16                AppendTo
32                Create
65536           Delete
262144          Share
524288          Assign
134217728    Undocumented

for example 
852023 (1+2+4+16+32+65536+262144+524288) - ALL documneted permissions

Whenever a record is shared against a User or a Team, CRM will be tracking those entries in PincipalObjectAccess table and same will be queried using FilteredView.

FilteredAccount View part of code

or

[Account].[AccountId] in
(
select  POA.ObjectId from PrincipalObjectAccess POA
join SystemUserPrincipals sup (NOLOCK) on POA.PrincipalId = sup.PrincipalId
where sup.SystemUserId = u.SystemUserId and
POA.ObjectTypeCode = 1 and
((POA.AccessRightsMask | POA.InheritedAccessRightsMask) & 1)=1
)

---Get the total number of shared records
SELECT COUNT(0) FROM PrincipalObjectAccess

--Get the total number of shared records grouped by Entity
SELECT  EV.NAME AS [ENTITY NAME],COUNT(POA.OBJECTTYPECODE) AS [RECORDS COUNT]
FROM PRINCIPALOBJECTACCESS POA
INNER JOIN ENTITYLOGICALVIEW EV ON EV.OBJECTTYPECODE = POA.OBJECTTYPECODE
GROUP BY EV.NAME
ORDER BY 2 DESC

--Get the total number of shared records grouped by User
SELECT  SU.FULLNAME AS [USER NAME],COUNT(POA.OBJECTTYPECODE) AS [RECORDS COUNT]
FROM PRINCIPALOBJECTACCESS POA
INNER JOIN SYSTEMUSER SU ON POA.PRINCIPALID= SU.SYSTEMUSERID
GROUP BY SU.FULLNAME
ORDER BY 2 DESC

--Get the total number of shared records grouped by Entity and User
SELECT  SU.FULLNAME AS [USER NAME],EV.NAME AS [ENTITY NAME],COUNT(POA.OBJECTTYPECODE) AS [RECORDS COUNT]
FROM PRINCIPALOBJECTACCESS POA
INNER JOIN SYSTEMUSER SU ON POA.PRINCIPALID= SU.SYSTEMUSERID
INNER JOIN ENTITYLOGICALVIEW EV ON EV.OBJECTTYPECODE = POA.OBJECTTYPECODE
GROUP BY SU.FULLNAME,EV.NAME
ORDER BY 1

SELECT DISTINCT name, objecttypecode
FROM [CRMORGDB_MSCRM].[MetadataSchema].[Entity]
ORDER BY name ASC 

 


select distinct
       case
           when POA.[PrincipalTypeCode] = 8 then
               'User'
           when POA.[PrincipalTypeCode] = 9
                and TEAM.[TeamType] = 0 then
               'Owner Team'
           when POA.[PrincipalTypeCode] = 9
                and TEAM.[TeamType] = 1 then
               'Access Team'
           else
               'Other'
       end                                       as 'PrincipalType'
     , coalesce(USERID.[FirstName], TEAM.[Name]) as PrincipalName
     , POA.[ObjectTypeCode]
     , ENTITY.[OriginalLocalizedName]
     , POA.[ObjectId]
     , POA.[AccessRightsMask]
     , POA.[InheritedAccessRightsMask]
     , POA.[ChangedOn]
     , POA.[PrincipalTypeCode]
     , POA.[PrincipalId]
from KYGF_MSCRM.[dbo].[PrincipalObjectAccess]            as POA
    left outer join KYGF_MSCRM.[dbo].[SystemUserBase]    as USERID
        on POA.[PrincipalId] = USERID.[SystemUserId]
    left outer join KYGF_MSCRM.[dbo].[TeamBase]          as TEAM
        on POA.[PrincipalId] = TEAM.[TeamId]
    left outer join KYGF_MSCRM.[MetadataSchema].[Entity] as ENTITY
        on POA.[ObjectTypeCode] = ENTITY.[ObjectTypeCode]
where POA.[PrincipalTypeCode] in ( 8, 9 )
      and POA.[ObjectTypeCode] = 2
      and POA.ObjectId = 'C84FBA58-8CCB-DF11-9176-02BF0AC9DF07';