ABAP CDS-Part 1(ABAP CDS實體)

文章翻譯自Tushar Sharma文章,轉載請註明原做者和譯者!html


在咱們開始以前sql

預備條件

SAP NetWeaver版本數據庫

  • SAP NetWeaver 7.5 SP01或者更高
  • 數據庫沒有特殊要求,可是推薦使用SAP HANA數據庫

開發環境api

  • 建議使用SAP NetWeaver最新版本的ABAP開發工具(即ADT)。您能夠在[此處]下載最新的ADT插件。關於開發工具,我連接一些其餘博客在本文末尾,能夠幫助瞭解更多相關知識。

SAP Gateway服務器

權限
要實現上述指南中描述的步驟,須要在SAP NetWeaver Application Server上分配如下角色的用戶:app

  • SAP_BC_DWB_ABAPDEVELOPER
  • SAP_BC_DWB_WBDISPLAY
  • /IWFND/RT_DEVELOPER (for SAP Gateway service development).

讓咱們開始吧!

1、概述

在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

2、ABAP CDS實體(CDS Entity)

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類型:

a.定義ABAP CDS Views

使用ABAP CDS聲明語句DEFINE VIEW,能夠爲現有的數據庫表和視圖或ABAP字典中的其餘CDS Views定義一個CDS Views。CDS Views用於定義SQL View的結構,並表示在一個或多個字典表或字典視圖上的投影。

注意:SQL View和CDS Entity是同一個命名空間的一部分。所以,必須爲SQL View和CDS Entity分配不一樣的名稱。
在DDL編輯器中定義CDS視圖
如上圖:在DDL編輯器中定義一個CDS View。CDS Entity ZCDS_VIEW定義了一個到數據庫表scustom的投影。生成的SQL View(ZcdsView)包含了全部選取的字段id,name,city.

激活

激活CDS View後,在ABAP字典中會建立如下對象:

  • 實際的CDS Entity (Zcds_View)
  • SQL View (ZcdsView)

b.ABAP CDS Table Functions

使用ABAP CDS聲明語句DEFINE TABLE FUNCTION能夠定義一個CDS Table Function,它能夠做爲數據源被OPEN SQL語句讀取。

每一個CDS Table Function包含如下部分:

  • 在ABAP字典中生成的Table Function的CDS Entity
  • CDS Table Function實現 (ABAP 類庫)

注意:相比於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.

3、ABAP CDS 訪問控制

ABAP CDS支持基於數據控制語言(DCL)的訪問控制。ABAP CDS的訪問控制進一步限制了從ABAP CDS中的CDS實體返回的數據。
ABAP CDS訪問控制基於如下內容:

  • CDS角色是使用DCL語句DEFINE ROLE定義的。目前,一個CDS角色被隱式地映射到每一個用戶。這也是爲何它們被稱爲映射角色的緣由。
  • 在CDS角色CDS Entity中定義訪問條件。訪問條件能夠是如下:
    一、字面條件(Literal conditions):相對於CDS實體元素的字面值(literal values)
    二、將CDS Entity的元素與SAP受權概念中的權限相關聯的PFCG條件。

若是爲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時,它會隱式的去校驗每一個角色中定義的訪問條件。

在上述示例中:

  • 條件語句sprsl=’E’限制了只能經過英語訪問
  • 關於PFCG條件方面,pfcg_auth ( s_develop … ) 語句將CDS角色關聯到了一個經典權限對象s_develop,CDS訪問控制運行時從中生成一個訪問條件,該條件評估當前用戶對該對象的受權。在這裏,預約義的pfcg_auth將權限字段objname關聯到了視圖字段arbgb。另外,檢查用戶的權限是否符合受權字段objtype和actvt的固定值。

NOTE:若是你不想有任何的訪問限制,你必須給訪問控制參數@AccessControl.authorizationCheck賦值#NOT_ALLOWED來禁用訪問控制。如此,CDS角色就會被忽視。

激活

當您激活DCL源時,SAP NetWeaver AS for ABAP會生成受權視圖並使用所需的元數據填充訪問控制管理表。角色在ABAP字典中被描述爲全局內部對象。

4、Note

  • 一旦建立,CDS View就能夠經過Open SQL 讀取語句在ABAP程序中使用。
  • 爲每一個CDS視圖建立一個CDS數據庫視圖,此視圖只支持透明表,這意味着池表和蔟表不能經過CDS View訪問。
  • 對於CDS View,CDS View加強是在不進行修改的狀況下進行加強的一種獨立方式。

參考文章

拓展閱讀

相關文章
相關標籤/搜索