首页 > 解决方案 > System.TypeException:__Share 上不允许 DML 操作 INSERT

问题描述

我在我的 salesforce 环境中创建了共享对象。从设置-> 安全控制-> 共享设置-> 我让我的自定义对象访问“私人”。因此,假设我的对象名称是 EVT_Client__c 并且我正在尝试从触发器(AfterInsert)将数据插入 EVT_Client__Share 我无法做到这一点。我收到如下错误。

一旦数据被插入到 EVT_Client__c 对象中,我们的触发器就会尝试将数据插入到 EVT_Client__share 对象中,但是我们得到了错误。通过对对象具有读取/创建/编辑/删除访问权限的 UI 将数据插入 EVT_Client__c 对象的配置文件用户。

System.TypeException:EVT_Client__Share 上不允许 DML 操作 INSERT

我在触发器中的代码如下所示,其中出现错误。

    public with sharing class EVT_Client_TriggerHandler {
    private void ShareClientToThirdPartyJobGroup(List<EVT_Client__c> lstClients){
    List<EVT_Client__Share> lstSharesForThirdPartyGroup = new List<EVT_Client__Share>();
    List<Group> lstThirdPartyGroups = [Select Id, RelatedId from Group where Name = 'Third Party'];

    for(EVT_Client__c client: lstClients){
        for(Group roleGroup : lstThirdPartyGroups ){
              EVT_Client___Share objShareForThirdPartyGroup = new EVT_Client__Share(ParentId = client.Id, 
                  UserOrGroupId = roleGroup.Id, 
                  AccessLevel = 'Edit', 
                  RowCause = Schema.EVT_Client__Share.RowCause.User_Client__Access__c);
          lstSharesForThirdPartyGroup.add(objShareForThirdPartyGroup);
        }   
    }

    insert lstSharesForThirdPartyGroup;
}
}

标签: salesforceapex-code

解决方案


你确定这不是任何主从关系中的“细节”吗?OWD 然后会说“由父母控制”而不是“私人”。您可以切换到经典视图,转到页面布局并验证[Sharing]可以添加按钮,显示 OK,此用户可以从 UI 手动共享此记录吗?

发布您的代码示例?我怀疑您需要先定义Apex 共享原因。如果您曾经玩过 Account/Contact/Opportunity/Case 角色,这有点像角色。

设置完成后,您应该可以执行以下代码示例:https ://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_bulk_sharing_creating_with_apex.htm (他们使用“手动”作为共享原因,但您可能对自定义共享原因有更多的运气。


我很快创建了你的对象,这对我来说就像一个魅力:

trigger Stack57201752 on EVT_Client__c (after insert) {

    List<Group> groups = [SELECT Id FROM Group WHERE Name = 'Third Party'];
    List<EVT_Client__Share> shares = new List<EVT_Client__Share>();
    for(EVT_Client__c c : trigger.new){
        for(Group g : groups){
            shares.add(new EVT_Client__Share(
                ParentId = c.Id, 
                UserOrGroupId = g.Id, 
                AccessLevel = 'Edit', 
                RowCause = 'Manual'
            ));
        }
    }
    insert shares;
}

当我单击[Sharing]记录上的按钮时,它看起来不错:

在此处输入图像描述


所以......愚蠢的提问时间:你点击了这个复选框吗?

在此处输入图像描述


推荐阅读