文章翻譯自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字典中被描述爲全局內部對象。