如何修改SOQL排除公式字段并解决Apex权限更新无效果问题
问题1:修改SOQL排除公式/计算字段
要过滤掉公式字段,需要关联FieldDefinition对象(存储字段元数据),通过其IsCalculated字段判断是否为公式/计算字段。修改后的SOQL如下:
SELECT Id, Field, SObjectType, PermissionsRead, PermissionsEdit FROM FieldPermissions WHERE ParentId IN ( SELECT Id FROM PermissionSet WHERE PermissionSet.Profile.Name = 'System Administrator' ) AND SObjectType = 'Simploud__Controlled_Document__c' AND (PermissionsRead = false OR PermissionsEdit = false) AND Field IN ( SELECT QualifiedApiName FROM FieldDefinition WHERE EntityDefinition.QualifiedApiName = 'Simploud__Controlled_Document__c' AND IsCalculated = false )
逻辑说明:通过子查询从FieldDefinition中获取指定对象的非公式字段API名,再用Field IN (...)过滤FieldPermissions结果,直接排除公式字段。
问题2:修复Apex代码权限不生效问题
你的代码存在两个核心问题:循环单条DML不符合最佳实践,且Profile关联的PermissionSet权限更新有特殊注意事项。修改后的代码如下:
// 直接查询目标权限记录,匿名窗口无需声明public变量 List<FieldPermissions> fieldPerms = [ SELECT Id, PermissionsRead, PermissionsEdit FROM FieldPermissions WHERE ParentId IN ( SELECT Id FROM PermissionSet WHERE PermissionSet.Profile.Name = 'System Administrator' ) AND SObjectType = 'Simploud__Controlled_Document__c' AND (PermissionsRead = false OR PermissionsEdit = false) AND Field IN ( SELECT QualifiedApiName FROM FieldDefinition WHERE EntityDefinition.QualifiedApiName = 'Simploud__Controlled_Document__c' AND IsCalculated = false ) ]; // 批量修改权限值 for(FieldPermissions fp : fieldPerms){ fp.PermissionsRead = true; fp.PermissionsEdit = true; } // 批量执行DML更新(避免单条DML触发限制) if(!fieldPerms.isEmpty()){ update fieldPerms; System.debug('成功更新' + fieldPerms.size() + '条字段权限记录'); }
额外注意事项:
- 权限生效延迟:修改后可能需要等待1-2分钟,或让用户重新登录才能看到权限变化。
- Profile锁定限制:部分标准Profile(如System Administrator)的核心权限可能被锁定,无法通过API修改,此时需前往Setup界面手动调整。
- 权限覆盖检查:确认没有其他PermissionSet或Profile的权限设置覆盖当前修改。
内容的提问来源于stack exchange,提问作者Suliman Qahaz
相关产品推荐
相关产品推荐

