非管理员用户查询FeedItem报错的解决方案咨询
FeedItem查询权限问题解决方案
错误原因
Salesforce对FeedItem对象有查询实现限制:非管理员用户无法直接通过ParentId批量查询FeedItem,必须满足权限检查或调整查询方式。
可行解决方案
方案1:添加权限强制检查子句
在查询中加入WITH SECURITY_ENFORCED,确保查询仅返回用户有权访问的FeedItem,同时要求用户对目标Opportunity记录有访问权限、对FeedItem对象有读取权限:
List<FeedItem> feeditemList = [SELECT ID, CreatedDate, CreatedById, CreatedBy.Name, ParentId, Parent.Name, Body FROM FeedItem WHERE ParentId = :oppId_Set ORDER BY CreatedDate DESC LIMIT 1 WITH SECURITY_ENFORCED];
方案2:逐记录查询(适合小型数据集)
避免批量ParentId查询,循环每个Opportunity Id单独查询FeedItem,单Id查询不会触发限制:
Datetime latestFeeditemDate = null; for(Id oppId : oppId_Set) { List<FeedItem> feedItems = [SELECT CreatedDate FROM FeedItem WHERE ParentId = :oppId ORDER BY CreatedDate DESC LIMIT 1]; if(!feedItems.isEmpty() && feedItems[0].CreatedDate != null) { if(latestFeeditemDate == null || feedItems[0].CreatedDate > latestFeeditemDate) { latestFeeditemDate = feedItems[0].CreatedDate; } } }
方案3:配置FeedItem共享规则
在Salesforce设置中配置FeedItem的共享规则,基于Parent记录(如Opportunity)的共享关系,让非管理员用户能访问对应Opportunity的FeedItem。
代码优化建议
原代码中循环遍历仅含1条数据的列表属于冗余操作,可简化为直接取列表首元素:
if(!feeditemList.isEmpty()) { FeedItem fi = feeditemList[0]; if(fi.CreatedDate != null) { latestFeeditemDate = fi.CreatedDate; System.debug('latestFeeditemDate: ' + latestFeeditemDate); } }
内容的提问来源于stack exchange,提问作者Sejal Gohil
相关产品推荐
相关产品推荐

