文章翻译自Tushar Sharma的文章,转载请注明原做者和译者!html
在咱们开始以前sql
SAP NetWeaver版本数据库
开发环境api
SAP Gateway服务器
权限
要实现上述指南中描述的步骤,须要在SAP NetWeaver Application Server上分配如下角色的用户:app
在SAP HANA引入CDS以后,SAP意识到CDS能够经过ABAP应用服务器引入,这将容许ABAP从CDS数据定义语言提供的加强功能中获益,而不是基于表单的ABAP字典工具。因此,在ABAP 7.40 SP05版本开始,SAP引入了ABAP CDS Views。因为ABAP字典已经具备定义表、视图和数据类型的能力,所以在ABAP应用服务器上引入CDS的方法是将其添加到ABAP字典中。基于源代码编辑器的ADT容许咱们在Eclipse 或 SAP HANA studio中建立数据定义语句(DDL)。框架
基于ABAP的CDS在SAP Business Suite 4 SAP HANA (SAP S/4HANA)里扮演着重要的角色。由数十万行ABAP代码,数千张CDS Views组成的一组大量CDS工件,已经被SAP引入,用来表示SAP S/4HANA解决方案的底层核心数据模型。标准的ABAP CDS Views,ERP表和视图能够在ADT源代码编辑器自定义CDS Views中重用。编辑器
自大部分主要功能已经被引入的ABAP7.50 SP00版本以来,使用ABAP CDS Views最主要的动机是在传统的物理SAP ERP表之上提供一个语义层。传统的物理SAP ERP表一般充当数据库上的物理数据容器。其拥有一个很是复杂的内部结构,大部分状况下,在没有传统的ABAP处理时不能进行评估。而CDS提供的富语义数据建模使SAP S/4HANA中的这一层可以简化、高效地访问底层数据。ide
ABAP CDS提供了一个框架,用来在ABAP应用服务器的中央数据库定义和使用语义数据模型。它基于ABAP字典管理的数据定义语言(DDL)和数据控制语言(DCL)。所以,CDS Entity或CDS Views的加强在CDS数据定义中被定义为源代码。函数
要定义一个CDS Entity,你首先须要建立一个DDL源( DDL source)做为相关的开发对象,使用该对象可使用ABAP工做台的标准功能——例如语法检查,激活,传输等功能。你能够在Eclipse ADT或SAP HANA studio ADT的基于文本的DDL编辑器中来定义CDS Entity。
ABAP CDS Entity类型:
使用ABAP CDS声明语句DEFINE VIEW,能够为现有的数据库表和视图或ABAP字典中的其余CDS Views定义一个CDS Views。CDS Views用于定义SQL View的结构,并表示在一个或多个字典表或字典视图上的投影。
注意:SQL View和CDS Entity是同一个命名空间的一部分。所以,必须为SQL View和CDS Entity分配不一样的名称。
如上图:在DDL编辑器中定义一个CDS View。CDS Entity ZCDS_VIEW定义了一个到数据库表scustom的投影。生成的SQL View(ZcdsView)包含了全部选取的字段id,name,city.
激活
激活CDS View后,在ABAP字典中会建立如下对象:
使用ABAP CDS声明语句DEFINE TABLE FUNCTION能够定义一个CDS Table Function,它能够做为数据源被OPEN SQL语句读取。
每一个CDS Table Function包含如下部分:
注意:相比于CDS Views,CDS Table Functions可以经过Native Sql实现。这种实现是在AMDP类的AMDP方法中完成的,并在数据库系统中的AMDP框架中做为一个AMDP函数来管理。
如上图:定义和实现一个CDS table function。
注意:实现AMDP的方法名,只能在一个CDS table function中指定。(1对1关系)
示例:Table function定义
下面,咱们经过DDL语法定义了一个CDS Table Function——TAB_FUNCTION_EXAMPLE 。这个表函数声明了两个输入参数clnt(带有预约义值:#CLIENT)和carrid。以及提供实现表函数的AMDP方法的返回值的元素列表。表函数与AMDP类CL_EXAMPLE_AMDP相关联,类的方法GET_FLIGHTS用于实现此表函数。
@ClientDependent: true @AccessControl.authorizationCheck: #NOT_REQUIRED define table function TAB_FUNCTION_EXAMPLE with parameters @Environment.systemField: #CLIENT clnt:abap.clnt, carrid : s_carr_id returns { client : s_mandt; carrname : s_carrname; connid : s_conn_id; cityfrom : s_from_cit; cityto : s_to_city; } implemented by method CL_EXAMPLE_AMDP=>GET_FLIGHTS;
示例:Table Function实现
本例中的公共ABAP类(AMDP类)提供了AMDP方法GET_FLIGHTS,它是表函数TAB_FUNCTION_EXAMPLE的实现。与其余任何AMDP类同样,CL_EXAMPLE_AMDP必须实现标记接口IF_AMDP_MARKER_HDB。AMDP方法GET_FLIGHTS使用Native SQL代码实现数据选取。
class cl_example_amdp definition public. public section. interfaces IF_AMDP_MARKER_HDB. class-methods get_flights for table function tab_function_example. protected section. private section. endclass. class cl_example_amdp implementation. method get_flights by database function for hdb language sqlscript options read-only using scarr spfli. RETURN SELECT sc.mandt as client, sc.carrname, sp.connid, sp.cityfrom, sp.cityto FROM scarr AS sc INNER JOIN spfli AS sp ON sc.mandt = sp.mandt AND sc.carrid = sp.carrid WHERE sp.mandt = :clnt AND sp.carrid = :carrid ORDER BY sc.mandt, sc.carrname, sp.connid; endmethod. endclass.
ABAP CDS支持基于数据控制语言(DCL)的访问控制。ABAP CDS的访问控制进一步限制了从ABAP CDS中的CDS实体返回的数据。
ABAP CDS访问控制基于如下内容:
若是为CDS实体定义了CDS角色,那么每当使用Open SQL或SADL查询去访问对象时,都会隐式地校验访问条件(除非给访问控制参数@AccessControl.authorizationCheck赋值#NOT_ALLOWED来禁用访问控制)。若是启用了访问控制(赋值:##CHECK),则只有知足访问条件的数据才能访问到。
每一个CDS角色都由一段单独的CDS源代码定义。此源代码只能经过ABAP Development Tools (ADT)修改。当激活后,CDS角色在ABAP字典中是一个全局内部对象。定义CDS角色的源代码与定义CDS Entity(CDS View 或 CDS Table Function)的源代码是在不一样的编辑器中编辑的。
假设咱们已经定义好了一个CDS View,以下:
@AbapCatalog.sqlViewName: ‘Z_T100_SABDEMOS’ @AccessControl.authorizationCheck: #CHECK. define view z_t100_sabapdemos as select from t100 { * } where arbgb = ‘SABAPDEMOS’
而后,咱们能够经过DCL(数据控制语言)为上述视图建立一个CDS角色(以下所示)。
@MappingRole: true define role role_name { grant select on z_t100_sabapdemos where ( arbgb ) = aspect pfcg_auth ( s_develop, objname, objtype = ‘MSAG’, actvt = ’03’ ) and sprsl= ‘E’ ; }
如今咱们有个问题须要思考:
DEFINE ROLE这个看似无害的语句作了些什么?
CDS角色向这个CDS View添加了一个额外的条件,即所谓的访问条件。而当你去尝试访问这个CDS View时,它会隐式的去校验每一个角色中定义的访问条件。
在上述示例中:
NOTE:若是你不想有任何的访问限制,你必须给访问控制参数@AccessControl.authorizationCheck赋值#NOT_ALLOWED来禁用访问控制。如此,CDS角色就会被忽视。
激活
当您激活DCL源时,SAP NetWeaver AS for ABAP会生成受权视图并使用所需的元数据填充访问控制管理表。角色在ABAP字典中被描述为全局内部对象。