Salesforce - 对象UserRecordAccess上的SOQL查询语法错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Salesforce - 对象UserRecordAccess上的SOQL查询语法错误相关的知识,希望对你有一定的参考价值。

根据使用对象“UserRecordAccess” [here]描述访问控制的Salesforce手册,我想获得Salesforce中给定“用户”和“案例”的权限列表。

使用交互式工作台工具,我在构造此查询时收到以下语法错误:

SOQL查询:

SELECT RecordId, HasReadAccess FROM  UserRecordAccess WHERE UserId = 'abc123xyz..' AND RecordId in (SELECT Id FROM Case WHERE CaseNumber = '10001026')

Workbench的验证消息:

MALFORMED_QUERY: The left operand field in the where expression for outer query should be an id field, cannot use: 'RecordId'

SOQL中是否有一种替代语法可用于构建此类嵌套查询?

找到的解决方案:作为解决方案路径,按照下面的答案,我在带有REST接口的APEX脚本中编写了一个代码,该接口按顺序执行三个SOQL查询。看代码:

@RestResource(urlMapping='/sfcheckap/*')
// sample:  /services/apexrest/sfcheckap/00001028&myid@red.com  
//
global with sharing class MyRestResource1 {

    @HttpGet
    global static Boolean doGet() {
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        String myinput = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
        List<String> inputList = myinput.split('&');
        String mycase = inputList[0];
        String myemail = inputList[1]; 
        sObject s1 = [SELECT Id FROM User WHERE Email = :myemail]; 
        ID MyUserId = s1.ID; 
        Case s2 = [SELECT Id FROM Case WHERE CaseNumber = :mycase LIMIT 1]; 
        ID MyCaseId = s2.ID; 
        System.debug('Dynamic MyCaseId is: ' + MyCaseId);
        UserRecordAccess s3 = [SELECT RecordId, HasReadAccess FROM UserRecordAccess 
                               WHERE UserId = :MyUserId AND RecordId = :MyCaseId]; 
        ID MyRecordId = s3.ID;
        Boolean result = s3.HasReadAccess;   
        return result;        
    }  
}
答案

您在WHERE子句中的SOQL查询将返回一组id(SET<ID>),然后将该字段与该集合的一个实例进行比较,我应该使用相同的数据类型。

以下是UserAccessRecord sObject的样子:

global class UserRecordAccess extends SObject 
{
    global Boolean HasAllAccess;
    global Boolean HasDeleteAccess;
    global Boolean HasEditAccess;
    global Boolean HasReadAccess;
    global Boolean HasTransferAccess;
    global String MaxAccessLevel;
    global String RecordId;
    global SObjectType SObjectType;
    global User User;
    global Id UserId;
    global APTTaskTemplate__c UserRecordAccess;

    global UserRecordAccess()
    {
    }
}

正如你所看到的UserAccessRecord.RecordIdString类型。

您应该能够在2个SOQL查询中执行此操作我相信,首先SOQL查询将获取Case Ids并将其转换为List类型。第二个会使用该列表。

以上是关于Salesforce - 对象UserRecordAccess上的SOQL查询语法错误的主要内容,如果未能解决你的问题,请参考以下文章

在Salesforce中通过REST API编辑自定义对象

SalesForce 集成 - 在 SF 对象定义更改时通知外部系统

用户对象的 Salesforce 字段级安全性

Salesforce 开发整理权限共享

Salesforce - 我可以在两种不同的对象类型上有一个查找字段吗?

Salesforce Sobject 对象更新操作