
同一张销售订单报表,总部财务需要查看多个公司的订单,海外子公司的财务只应查看本公司的订单。页面可以完全一样,查询程序也可以完全一样,真正需要变化的是返回的数据范围。我们在设计这类应用时,不能只考虑菜单是否可见、按钮是否可用,还要落实到一个更具体的问题,当前登录用户执行查询时,哪些业务记录可以从数据库中读出来。这个问题正是 ABAP CDS Access Control 要处理的内容。它把读取权限放到 CDS 数据模型附近定义,使访问受保护 CDS 实体的 ABAP SQL 查询自动受到权限条件约束。程序里即使没有逐行编写权限判断,数据库读取也会按照当前用户的授权范围过滤结果。这里的「自动」有明确边界。它针对的是通过 ABAP SQL 访问受保护 CDS 实体的读取过程,不能据此认为底层数据库表、所有上层视图以及所有服务入口都已经自动受到保护。理解这一边界,比记住几个 DCL 关键字更有价值。我们可以把传统报表中的两类权限问题分开看。一个问题是用户能不能运行某项功能,另一个问题是功能运行后能读取哪些数据。前者通常涉及事务启动权限、服务访问权限或程序中的显式权限检查,后者则适合通过 CDS 访问控制实现。两者经常同时存在,解决的是不同层面的约束。传统 ABAP 开发中,AUTHORITY-CHECK是非常熟悉的语句。程序检查授权对象及其字段值,并根据检查结果决定继续处理还是拒绝操作。CDS 访问控制走的是另一条路径,它在读取数据时隐式应用访问条件,让不满足条件的记录不进入查询结果。SAP 官方文档也明确说明,CDS 授权机制与传统 ABAP 授权机制共同存在,而不是相互替代。