本篇參考:
一. Currency 處理
我們在develop console執行以下的SQL,發現會報錯, Unknown error parsing query。
select id, name,AnnualRevenue from account where AnnualRevenue >= 10000000000

當時其實疑問挺多的,因為 AnnualRevenue是Currency類型,在我想象中,salesforce會使用 Decimal進行解析,Decimal的范圍是 -2的63次方--2的63次方-1。在問群里大神以后知道了,如果值傳遞的是整數情況下,會使用 Integer進行轉換,而 Integer的范圍是 -2的31次方到2的31次方-1即-2147483648~2147483647,圖中輸入的值超過了這個值,所以報錯。解決方案只需要后面變成 .0即可,salesforce便會將其轉換成Decimal,從而可以進行正常搜索。
二. inherited sharing
在 Winter 19 version 44的時候,salesforce針對 sharing modal設置了三個模式, with sharing / with out sharing 以及 inherited sharing。在我們之前的篇中講過salesforce 零基礎開發入門學習(十二)with sharing 、without sharing 、無聲明區別 無聲明通常用於不知道當前的類應該 with/ with out,取決於前一個調用類的 sharing modal情況下使用無聲明,在 v44以后,官方不建議使用 無聲明的類,而是應該使用 inherited sharing這個聲明,這種聲明和無聲明方式大體功能相同,但是更安全。他們也不是一點區別都沒有,最大的區別如下:
當當前的class直接和前端頁面交互時, inherited sharing默認是 with sharing,但是 不聲明方式是without sharing。驗證如下:
1. 類中使用 inherited sharing
public inherited sharing class InheritedSharingClass{ public List<Contact> getAllTheSecrets(){ return [SELECT Name FROM Contact]; } }
2. vf頁面直接關聯當前的頁面作為controller
<apex:page controller="InheritedSharingClass"> <apex:repeat value="{!allTheSecrets}" var="record"> {!record.Name} </apex:repeat> </apex:page>
當前的 contact的 OWD設置的 private,找一個低權限的人運行,展示效果如下:
我們可以看到,因為他沒有Own以及被share的數據,所以展示空空如也。將apex 改一下:
public class InheritedSharingClass{ public List<Contact> getAllTheSecrets(){ return [SELECT Name FROM Contact]; } }
結果展示:
可以看出來如果直接連接前台頁面作為 controller的情況下兩者的區別。另外需要考慮, inherited sharing只有v44以后才可以使用,以前的項目version低不可以使用。V44版本以后沒有使用模式聲明的情況下,建議添加 inherited sharing
三. WITH SECURITY_ENFORCED
security_enforced是 v45作為beta,48作為正式版,所以我們如果使用 SECURITY_ENFORCED最好在V48及以后使用。我們都知道,apex運行在 system上下文,也就是說運行時,apex會忽略當前的用戶對某個表是否有權限,某個字段是否有權限,均可以進行CRUD操作。作為 ISV進行package開發或者其他嚴格的權限訪問場景,可能需要根據當前的用戶權限來決定是否可以訪問哪些字段,比如schema命名空間去查看某個字段是否 isAccessable等等。 當我們在SOQL使用WITH SECURITY_ENFORCED以后,會嚴格按照當前user權限來走,如果當前權限對select的內容或者from內容有權限,按照正常走,如果沒有權限,直接拋出異常。需要注意的是,這個關鍵字只針對 SELECT以及FROM內容的表字段有效,比如where或者order by等關鍵字后面的字段沒有權限不影響。值得注意的是,這個關鍵字只能在apex中使用。官方給的demo如下:如果當前用戶對 parent的website沒有權限,則會拋出異常,結果返回空。
List<Account> act2 = [SELECT Id, parent.Name, parent.Website
FROM Account WITH SECURITY_ENFORCED]
總結:篇中對三部分進行簡單的小結,更細節的使用方式建議自行查看官方文檔。使用前一定要注意一下當前的版本號。篇中有錯誤地方歡迎指出,有不懂歡迎留言。