Мне интересно, есть ли разница между isSet() и getRemovedFields() для определения недоступных полей, которые были удалены методом stripInaccessible().

Из официальной документации Обеспечение безопасности с помощью метода stripInaccessible :

Чтобы определить недоступные поля, которые были удалены, вы можете использовать метод isSet.

SObjectAccessDecision securityDecision = Security.stripInaccessible(sourceRecords);
Contact c = securityDecision.getRecords()[0];
System.debug(c.isSet('social_security_number__c')); // prints "false"

Также есть еще один пример, но на этот раз с getRemovedFields():

   Security.SObjectAccessDecision securityDecision =
            Security.stripInaccessible(AccessType.READABLE,
            [SELECT Name, BudgetedCost, ActualCost FROM Campaign];
            );

    // Construct the output table
    if (securityDecision.getRemovedFields().get('Campaign').contains('ActualCost')) {
        for (Campaign c : securityDecision.getRecords()) {
            //System.debug Output: Name, BudgetedCost
        }
    } else {
        for (Campaign c : securityDecision.getRecords()) {
            //System.debug Output: Name, BudgetedCost, ActualCost
        }
    }

Мы могли бы легко написать securityDecision.getRecords()[0].isSet('ActualCost'), чтобы проверить, недоступна ли ActualCost. Так в чем же разница?

2
Eduard 29 Июл 2020 в 16:34

1 ответ

Лучший ответ

sObject#isSet — это метод, который просто сообщает вам, установлено ли для поля значение.

Возвращает информацию о запрошенном поле sObject. Возвращает значение true, если поле sObject заполнено либо путем прямого присвоения, либо путем включения в запрос SOQL. Возвращает false, если поле sObject не установлено. Если указано недопустимое поле, создается исключение SObjectException.

В нем особо отмечается:

Метод isSet не проверяет, доступно ли поле конкретному пользователю с помощью разрешений организации или других специальных разрешений на доступ.

Итак, технически этот метод используется просто для проверки того, установлено ли значение. Вы можете использовать это в других контекстах за пределами Security.stripInaccessible, например, чтобы проверить, включает ли запрос SOQL данное поле (полезно для динамического апекса). Вам нужно будет проверить предварительно очищенные записи и записи после удаления, чтобы определить, было ли поле удалено с помощью System.stripInaccessible (по сравнению с тем, было ли оно когда-либо установлено с самого начала).

Правильным способом проверки удаленных полей будет getRemovedFields.

3
sfdcfox 29 Июл 2020 в 18:06