
在 SAP S/4HANA 项目里,经常会遇到这样一种很有意思的现象。同样一段SELECT,同样读取一个 CDS View Entity,不同业务账号执行之后,返回的记录数量却完全不同。代码里明明没有针对SalesOrganization、CompanyCode或者Plant写额外的WHERE,ST05 或 SQL Trace 里却能看到数据库真正执行的 SQL 已经附带了额外过滤条件。这并不是 ABAP SQL 偷偷改了程序,而是 ABAP CDS 的 Access Control 在运行时发挥了作用。传统 ABAP 开发人员对AUTHORITY-CHECK通常非常熟悉。程序读取销售订单之前,可以显式检查某个 Authorization Object,检查失败后自行决定报错、退出或者隐藏功能。CDS Access Control 走的是另一条路线。权限逻辑并不要求每一段业务程序都显式调用AUTHORITY-CHECK,而是通过 CDS DCL,也就是 Data Control Language,把数据访问规则绑定到 CDS Entity 上。当 ABAP SQL 读取受保护的 CDS Entity 时,ABAP Runtime 会把这些权限条件隐式加入数据选择过程。因此,CDS Access Control 更接近一种行级数据过滤机制。权限不足时,很多情况下并不会得到一个传统意义上的「没有权限」异常,系统只是不会把不允许访问的数据行返回给当前用户。SAP 官方目前对这套机制的描述也非常直接,CDS