Apex的对象共享
Apex的对象共享
在Apex中,每个对象都有一个“共享”对象,其中存储了该对象的共享设定。
这种共享对象以“share”结尾。比如Account的共享对象是AccountShare,Contact的共享对象是ContactShare。对于自定义对象,其对应的共享对象是以“__share”结尾,比如“Example_Object__c”对应的共享对象是“Example_Object__share”。
注意,在“主-详细”(Master-Detail)关系中“详细”方面的对象没有对应的共享对象,因为它的共享设定是由“主”方面的对象决定的。
注意,只有当对象的“组织范围内默认”(Organizational-wide-default)设置为“专用”(Private)时,共享对象才会启用。如果没有启用,在Apex代码中调用“XXX__share”时会出现该类型不存在的错误。
这种设定的原因是:共享对象对应的是Salesforce内部数据库中的共享数据表。当对象的“组织范围内默认”设定为“公共”的时候,该对象不存在单独的共享设定,所以对应的共享对象也无法使用。
共享对象属性
共享对象包括以下属性:
- objectNameAccessLevel:这个属性表明了该共享的共享级别,其名字是对象名后面加上“AccessLevel”,比如LeadShare中的属性就是LeadShareAccessLevel。该属性的值可以是Edit、Read、All
- ParentID:该属性表明了该共享对象对应的数据记录的ID,无法被更改
- UserOrGroupId:该属性表明了被共享的用户或组的ID,无法被更改
- RowCause:该属性表明了共享的原因,无法被更改,默认值是“Manual”
共享原因
共享原因可以在设置界面中创建。每个对象都可以有自己的共享原因,在每个对象的详细信息页面中有“Apex 共享原因”相关列表。在那里可以创建和编辑共享原因。
在Apex中使用时,共享原因的名字后面要加“__c”。
共享对象的代码示例
首先在设置界面中创建一个自定义对象“Example_Object__c”,然后创建一个“Apex 共享原因”,名为“Example_SR”。
以下代码可以对该自定义对象创建一个共享对象:
// 创建示例自定义对象
Example_Object__c exObj = new Example_Object__c(Name = 'test object');
insert exObj;
// 创建共享对象
Example_Object__share exSha = new Example_Object__share();
// 设定共享对象的各个属性值
exSha.AccessLevel = 'Edit';
exSha.ParentId = exObj.Id;
exSha.UserOrGroupId = System.UserInfo.getUserId();
exSha.RowCause = Schema.Example_Object__share.RowCause.Example_SR__c; // 在这里,使用了Schema来调用共享原因
// 插入共享对象到数据库
insert exSha;