2

如何查询给定用户具有读取权限的所有帐户?我尝试了以下,但返回错误“半连接子选择只能查询 id 字段,不能使用:'RecordId'”

User u = new User();    
Account[] account = [SELECT Name FROM Account a
                            WHERE Id IN
                            (
                                SELECT RecordId
                                FROM UserRecordAccess
                                WHERE RecordId = :a.Id
                                AND UserId = :u
                                AND HasReadAccess = true
                            )
                    ];

该代码正在作为作为系统运行的计划批处理作业的一部分执行,因此“共享”的使用不适用。

谢谢

4

2 回答 2

2

销售人员文档说 RecordID 是一个看起来很奇怪的选项列表字段。如果它是一个选项列表字段,可以解释为什么它在子查询中不起作用。

您可以尝试先构建一组 RecordID,然后使用它来过滤 Account 查询。

Set<ID> sRecordIDs = [SELECT RecordID FROM UserRecordAccess WHERE UserId = :u AND HasReadAccess = True];

Account[] accs =[SELECT ID,Name FROM Account WHERE Id in :sRecordIDs];

如果 UserRecordAccess 中的记录数很高,这可能会超出调控器限制。

于 2012-05-26T16:41:59.770 回答
0

如果您只想为 Account 执行此操作,您可以尝试以下操作:

User u = new User();
list<Account> accs = [select Id, Name from Account where Id in (select AccountId from AccountShare where UserOrGroupId = :u.Id) or OwnerId = :u.Id];

这应该为您提供用户有权访问或拥有的所有帐户记录。在一般情况下,每个 sObject 都有自己的“共享”sObject,它表示对它的可见性,除非它以某种方式退化(即它是主细节中的细节)。

于 2012-06-01T14:07:33.500 回答