Dynamics 365 POA表记录的查询
微软动态CRM专家罗勇 ,回复313或者20190311可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me 。
PrincipalObjectAccess表是用于共享记录,这个表如果记录太多,会导致系统整体性能下降,最好能控制下记录数量。
如果部署的是Dynamics 365 Customer Engagement On-Premise版本,直接上数据库查询可以,执行如下T-SQL即可。
select count(*) from PrincipalObjectAccess with (nolock)
如果估计返回记录不超过5000行记录,也可以直接用Web API来查看,带上$count=true即可,实例代码如下:
https://demo.luoyong.me/api/data/v9.0/principalobjectaccessset?$select=principalobjectaccessid&$count=true https://demo.luoyong.me/api/data/v9.0/principalobjectaccessset?$select=principalobjectaccessid&$filter=objecttypecode eq 'template'&$count=true
执行效果类似如下,如果返回的 @odata.count 元素值等于5000,请不要相信这是准确数据,请用后面的方法查看。

如果前面返回的记录数为5000,但是估计在5万条下,也可以执行使用类似如下的URL进行查询,当然如果超过5万行会报错。
https://demo.luoyong.me/api/data/v8.2/principalobjectaccessset?fetchXml=%3Cfetch%20aggregate=%27true%27%20version=%271.0%27%20mapping=%27logical%27%20distinct=%27false%27%3E%0A%C2%A0%3Centity%20name=%27principalobjectaccess%27%3E%0A%C2%A0%C2%A0%3Cattribute%20aggregate=%27count%27%20alias=%27recordscount%27%20name=%27principalobjectaccessid%27%20/%3E%0A%C2%A0%3C/entity%3E%0A%3C/fetch%3E%0A%20%20%20%20
这其实是用Web API执行如下的聚合FetchXml:
<fetch aggregate='true' version='1.0' mapping='logical' distinct='false'>
<entity name='principalobjectaccess'>
<attribute aggregate='count' alias='recordscount' name='principalobjectaccessid' />
</entity>
</fetch>
如果超过5万行的话怎么计数?当然我不会阻拦你自己写程序来做,但是我已经有工具了,建议你不要重复造轮子。参考我的博文:无依赖简单易用的Dynamics 365实体记录数计数器并能计算出FetchXml返回的记录数 。直接执行如下的FetchXml即可:
<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='principalobjectaccess'>
<attribute name='principalobjectaccessid' />
</entity>
</fetch>
也可以对这个实体做筛选,类似如下的FetchXml:
<fetch version='1.0' mapping='logical' distinct='false'>
<entity name='principalobjectaccess'>
<attribute name='principalobjectaccessid' />
<filter type='and'>
<condition attribute='objecttypecode' operator='eq' value='2010' />
</filter>
</entity>
</fetch>
执行效果如下图所示:

你可能会有疑问,怎么看一个实体的ObjectTypeCode的值,根据实体的逻辑名称来查看实体的ObjectTypeCode用类似如下的URL:
https://demo.luoyong.me/api/data/v9.0/EntityDefinitions(LogicalName='account')?$select=EntitySetName,ObjectTypeCode
你可能还会问,如果根据ObjectTypeCode来看是哪个实体,用如下的URL即可:
https://demo.luoyong.me/api/data/v9.0/EntityDefinitions?$select=EntitySetName,LogicalName&$filter=ObjectTypeCode eq 2010
当然也可以将记录导出来分析,下面是一个示例,将数据生成CSV文件,然后用Excel或者导入到数据库中分析,数据分页查询请参考:Page large result sets with QueryExpression 。
private static void GetAllPOA(OrganizationServiceProxy orgSvc)
{
string outPutFileName = ConfigurationManager.AppSettings["outPutFileName"];
if (!File.Exists(outPutFileName))
{
string clientHeader = $"principalobjectaccessid,principalid,objecttypecode,objectid,principaltypecode,inheritedaccessrightsmask,changeon,accessrightsmask{Environment.NewLine}";
File.WriteAllText(outPutFileName, clientHeader);
}
int queryCount = ;
int pageNumber = ;
QueryExpression pagequery = new QueryExpression("principalobjectaccess");
pagequery.NoLock = true;
pagequery.AddOrder("changedon", OrderType.Descending);
pagequery.ColumnSet = new ColumnSet("principalobjectaccessid", "principalid", "objecttypecode", "objectid", "principaltypecode", "inheritedaccessrightsmask", "accessrightsmask", "changedon");
pagequery.PageInfo = new PagingInfo();
pagequery.PageInfo.Count = queryCount;
pagequery.PageInfo.PageNumber = pageNumber;
pagequery.PageInfo.PagingCookie = null; while (true)
{
EntityCollection results = orgSvc.RetrieveMultiple(pagequery);
if (results.Entities != null)
{
foreach (var entity in results.Entities)
{
File.AppendAllText(outPutFileName, $"{entity.GetAttributeValue<Guid>("principalobjectaccessid")}," +
$"{entity.GetAttributeValue<Guid>("principalid")}," +
$"{entity.GetAttributeValue<string>("objecttypecode")}," +
$"{entity.GetAttributeValue<Guid>("objectid")}," +
$"{entity.GetAttributeValue<string>("principaltypecode")}," +
$"{entity.GetAttributeValue<int>("inheritedaccessrightsmask")}," +
$"{entity.GetAttributeValue<DateTime>("changedon").ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss.fff")}," +
$"{entity.GetAttributeValue<int>("accessrightsmask")}{Environment.NewLine}");
}
}
if (results.MoreRecords)
{
pagequery.PageInfo.PageNumber++;
pagequery.PageInfo.PagingCookie = results.PagingCookie;
}
else
{
break;
}
}
}
Dynamics 365 POA表记录的查询的更多相关文章
- Dynamics 365 POA表记录的产生
微软动态CRM专家罗勇 ,回复314或者20190311可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 前面的博文 Dyna ...
- MyBatis 用户表记录数查询
搭建MyBatis开发环境,实现用户表记录数查询 1.在MyEclipse中创建工程,导入MyBatis的jar包
- MySQL(多表的表记录的查询)
一.外键约束 1.创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMAR ...
- laravel利用subquery使左连接查询右表数据唯一查询
如:表a,连接表b,b中有多条符合查询的记录 1.建立需要的子查询 $sub = DB::table('b')->select(['aid'])->selectRaw('max(id) a ...
- 三十一.MySQL存储引擎 、 数据导入导出 管理表记录 匹配条件
1.MySQL存储引擎的配置 查看服务支持的存储引擎 查看默认存储类型 更改表的存储引擎 设置数据库服务默认使用的存储引擎 1.1 查看存储引擎信息 mysql> SHOW ENGINES\G ...
- Database基础(三):SQL数据导入/导出、 操作表记录、查询及匹配条件
一.SQL数据导入/导出 目标: 使用SQL语句完成下列导出.导入操作: 将/etc/passwd文件导入userdb库userlist表并给每条记录加编号 将userdb库userlist表中UID ...
- Dynamics 365 CE中AsyncOperationBase表记录太多,影响系统性能怎么办?
微软动态CRM专家罗勇 ,回复311或者20190311可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 本文主要是根据微软官 ...
- 无依赖简单易用的Dynamics 365实体记录数计数器并能计算出FetchXml返回的记录数
本人微信公众号:微软动态CRM专家罗勇 ,回复278或者20180812可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 我们 ...
- Dynamics 365 Web Api之基于single-valued navigation property的filter查询
本篇要讲的是dynamics 新版本中web api的一个改进功能,虽然改进的很有限,但至少是改进了. 举个例子,我们现在知道联系人的名字vic,我们想找出客户记录中主要联系人名字为vic的所有客户, ...
随机推荐
- 深入理解Spring Redis的使用 (七)、Spring Redis 使用 jackson序列化 以及 BaseDao代码
之前在介绍Spring Redis进行存储的时候,都是通过RedisTemplate中的defaultSerializer,即JdkSerializationRedisSerializer.通过Jdk ...
- JDK设计模式之—动态代理
代理模式的特点 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口.代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类. 代理类的对象并不是真正实现服务,而是通过调用委 ...
- [Swift]LeetCode735. 行星碰撞 | Asteroid Collision
We are given an array asteroids of integers representing asteroids in a row. For each asteroid, the ...
- [Swift]LeetCode1018. 可被 5 整除的二进制前缀 | Binary Prefix Divisible By 5
Given an array A of 0s and 1s, consider N_i: the i-th subarray from A[0] to A[i] interpreted as a bi ...
- python网络-多线程(22)
一.什么是线程 线程(英语:thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.同一进程中的多条线程将共享该进程中的全部系统资源,一个进程可以有很多线程,每 ...
- cassandra vs mongo (1)存储引擎
摘要 在MongoDB 初识篇中谈到过Mongo 与 Cassandra的区别,这边再谈谈Mongo与Cassandra的存储引擎差别 概括 存储引擎: 类型 功能 应用 hash 增删改.随机读.顺 ...
- 「造个轮子」——cicada 源码分析
前言 两天前写了文章<「造个轮子」--cicada(轻量级 WEB 框架)> 向大家介绍了 cicada 之后收到很多反馈,也有许多不错的建议. 同时在 GitHub 也收获了 80 几颗 ...
- vue组件,可以通过npm引用的组件
本文章通过实现一个vue-dialog的弹出层组件,然后附加说明如果发布此包到npm,且能被其他项目使用. 功能说明 多层弹出时,只有一个背景层. 弹出层嵌入内部组件. 弹出层按钮支持回调 源码下载 ...
- Qt之自定义托盘
说起Qt,真是个不错的ui库,不仅仅ui做的好,其他方面也不差,在平台扩展方面也是非常的强大.这篇文章我将会分析下qt的托盘,QSystemTrayIcon是qt的托盘类,托盘类的用途是什么我就不说了 ...
- Eclipse导入别人的项目报错:Unable to load annotation processor factory 'xxxxx.jar' for project
使用eclipse导入别人的项目时候,报错Unable to load annotation processor factory 'xxxxx.jar' for project. 解决方案 1.项目右 ...