salesforce零基础学习(九十六)项目中的零碎知识点小总结(四)
本篇参考:
一. 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]
总结:篇中对三部分进行简单的小结,更细节的使用方式建议自行查看官方文档。使用前一定要注意一下当前的版本号。篇中有错误地方欢迎指出,有不懂欢迎留言。
最新文章
- table表格中实现tbody部分可滚动,且thead部分固定
- 如何解决android studio 运行时中文乱码的问题
- GDAL编译(转)
- [java学习笔记]java语言基础概述之转义字符&;break&;continue
- android-adb通用
- C#工具类(包含获取枚举描述方法)
- Oracle常用操作
- JS框架设计读书笔记之-核心模块
- TensorLayer官方中文文档1.7.4:API – 数据预处理
- C#版 - Leetcode 201. 数字范围按位与(bitwise AND) - 题解
- PAT A1017 Queueing at Bank (25 分)——队列
- 深入理解.sync修饰符
- awk调用shell
- ntohs, ntohl, htons,htonl的比较和详解【转】
- Android 手机 ADB FastBoot 命令基本用法
- 15个常用GCC命令
- 【python 3.6】笨办法取出列表中的字典的value
- Keras学习-1
- 【Android学习】Android工程资源命名禁忌
- 【22,23节】Django的GET和POST属性笔记