笔者的ABAP 开发教程里,有读者提到这个问题,专门写一篇文章来聊聊。
基于 ABAP 技术栈的 SAP 产品,底层到底支持哪些数据库?笔者在 SAP 开发领域工作了 18 年,亲身经历了 anyDB Suite on HANA S/4HANA only on HANA 的迁移轨迹。
SAP ERP(ECC)与 SAP Business Suite 7
SAP ERP ECC 与 SAP CRM,SAP SRM 7.x 等均归属于 SAP Business Suite 7。这一代产品建立在 SAP NetWeaver 基础上,长期支持多数据库平台的 anyDB 策略:Oracle Database、IBM Db2(含 LUW、z/OS、i 平台变种)、Microsoft SQL Server、SAP MaxDB、SAP ASE 均在列。
https://help.sap.com/docs/SAP_NETWEAVER_750/ccc9cdbdc6cd4eceaf1e5485b1bf8f4b/840cb892edfbc34290c1685132006662.html
SAP Help 的 Supported Databases 文档与 System Copy 的目标数据库清单,直接罗列了 Oracle、Microsoft SQL Server、IBM Db2、SAP MaxDB、SAP ASE 等平台;此外,SAP NetWeaver 官方维护策略也明确 Business Suite 7 可运行在 SAP 自有数据库与第三方数据库的平台组合上,具体组合需以 SAP 官网PAM(Product Availability Matrix) 显示为准。
https://support.sap.com/en/release-upgrade-maintenance.html
SAP S/4HANA
进入 S/4HANA 时代,数据库策略发生本质变化:S/4HANA 只支持 SAP HANA 数据库。这一点在 SAP 官方的 Getting Started with SAP S/4HANA 2023 文档中写得很直接:全新安装的 SAP S/4HANA 需要运行在 SAP HANA 数据库之上。
SAP Sales Cloud & Service Cloud
也就是以前所说的 SAP Cloud for Customer,这类 SAP 自研的 SaaS 产品,官网明确标注为 powered by SAP HANA,这意味着服务端持久化层以 SAP HANA 为基础,无需客户自建或自控数据库。
在更大的 SAP 云平台谱系中,SAP HANA Cloud 是 SAP BTP 的数据库管理基石,提供 DBaaS 能力,承载事务型与分析型混合负载。
如何在系统内判断当前数据库类型?
对一线开发与运维人员而言,有时候需要精确判断,我眼前这套系统到底跑在什么数据库上?
ABAP 提供了多层手段,既能判定当前标准连接数据库,也能识别二级连接的数据库类型。
最直接的办法就是读取系统字段 sy-dbsys.
sy-dbsys 是 ABAP 运行时填写的系统字段,表示当前中央数据库系统,如果打印出 HDB 则代表 HANA 数据库。
也可以使用工具类 CL_DB_SYS,其静态构造函数对 sy-dbsys 做了封装:
还可以使用另一个工具类 CL_ABAP_DBFEATURES 对当前数据库支持的特性进行嗅探。
当代码需要根据数据库能力切换实现路径时,可用 CL_ABAP_DBFEATURES 在运行时判定某能力是否可用,例如 AMDP、参数化视图,使用 SELECT 读取内表等特性。
比如笔者之前文章介绍的一个 ABAP 新特性:
每日5分钟,学习一个 ABAP 冷门知识点 (3):ABAP 内表也能用 SELECT 来读取了?
这个特性只在 ABAP 7.52 及以上的版本才能使用。
那么可以在 ABAP 代码里首先判断当前的 ABAP 是否支持这个新特性,如果支持,使用新语法;否则降级成传统的写法。
伪代码如下:
IF cl_abap_dbfeatures=>use_features( VALUE #( ( cl_abap_dbfeatures=>itabs_in_from_clause ) ) ). " 使用新语法读取 ABAP 内表数据ELSE. " 兜底实现,使用传统语法ENDIF.
如果系统通过事务 DBCO 配置了二级数据库连接,可读取表 DBCON 的 DBMS 字段来识别远端数据库厂商与连接信息。
关于 ABAP 数据库二级连接,服务连接等概念的理解和应用,请参阅笔者之前的文章:
你知道吗?ABAP 在同一进程开多条数据库连接原来这么简单
玩转 ABAP 多数据库连接:标准连接、二级连接与服务连接的实战指南