最近有两个朋友先后问我:SAP ABAP 系统是否支持通过 OPEN SQL 直接读取外部 MySQL 和 PostgreSQL 数据库的内容?
笔者之前的文章曾经提到,在一些复杂度较高的 ABAP 实现项目中,需要在同一个 ABAP 报表中同时访问多个数据库模式,甚至完全不同的数据库系统。
SAP 在 NetWeaver 里通过 Open SQL Multi‑Connect 机制,提供了标准连接(Standard Connection)、二级连接(Secondary Connection)与服务连接(Service Connection)三种方式,并允许它们在 Open SQL、Native SQL (EXEC SQL)、ADBC 以及 AMDP 之间共享。
你知道吗?ABAP 在同一进程开多条数据库连接原来这么简单
玩转 ABAP 多数据库连接:标准连接、二级连接与服务连接的实战指南
数据库表 DBCON 的 DBMS 字段,定义了 SAP 官方支持的外部数据库管理系统。
可以看到,MySQL 和 PostgreSQL 这两种数据库,没有出现在上图的列表里。
那么在 ABAP 系统里没有办法使用 OPEN SQL 「直接连接」这两种外部数据库了吗?
SAP 社区有类似的讨论:
https://community.sap.com/t5/enterprise-resource-planning-q-a/connect-to-postgresql/qaq-p/12231137
https://community.sap.com/t5/technology-q-a/connection-to-mysql-database-dbco-settings/qaq-p/7969448
https://community.sap.com/t5/technology-q-a/connect-sap-to-mysql-database-via-odbc/qaq-p/12340553
答案是:不支持。
那为什么 ABAP OPEN SQL 通过 DBCO 的配置,却能够直接访问像 SAP MaxDB,Oracle 和 Microsoft SQL Server 这种数据库呢?
这得从 ABAP OPEN SQL 的工作原理说起。
在 ABAP 内核里有一层专用的数据库接口,负责把数据库无关的 ABAP OPEN SQL 翻译为目标数据库的原生指令(Native SQL),并处理通信与事务等细节。
这个数据库接口层被官方称作 Database Service Layer / DBSL,是 SAP 内核与数据库之间的最低软件层。
SAP 为每种支持的数据库都编写了对应的 DBSL,命名规范为 db<dbs>slib. 这些库由 ABAP 内核加载。
https://help.sap.com/docs/DB6/e3eefec5d20740f4872652a475457348/a8f648e218874928a1914f15e4e3746e.html
事务码 DBCO 的作用是维护表 DBCON,用于登记额外的二级连接和服务连接的数据库类型、连接名、用户等元数据信息,以便在 ABAP 应用程序里把某条语句指向这些外部数据库连接;DBCO 本身不提供驱动。
SAP 官方并没有为 MySQL 和 PostgreSQL 提供默认的 DBSL 实现,因此这两种类型的数据库,没有出现在 SAP 官方文档的支持列表中:
https://help.sap.com/docs/SAP_NETWEAVER_750/ccc9cdbdc6cd4eceaf1e5485b1bf8f4b/840cb892edfbc34290c1685132006662.html
因此要实现 ABAP OPEN SQL 对 MySQL 和 PostgreSQL 这两种数据库进行读写访问,有两种思路。
第一种是在 ABAP 系统和这两个外部数据库之间引入一个中间服务器。在中间服务器上部署 Java/Python/Node.js 应用。这三种技术栈的生态圈里,有非常成熟的对 MySQL / PostgreSQL 进行读写操作的工具库。
ABAP 连接这个中间服务器,后者接到读写请求后,通过工具库将请求投递到外部数据库,完成读写操作后,再将响应数据转发给 ABAP.
这种方案引入了一个新的通信节点,也就增加了一个新的故障源。同时在读写实时性要求很高的场合,需要仔细评估性能。
第二种思路的前提是 ABAP 系统底层使用了 HANA 数据库,且 HANA 的版本需要支持 SDA / SDI 特性。
SDA(Smart Data Access):让 SAP HANA 以本地表的方式访问远端数据源,而无需先把数据复制进 HANA;对外表现为虚拟表,查询由 HANA 优化器将可下推的片段推送到远端执行。
SDI(Smart Data Integration):面向连接、复制、转换与编排的 ETL/ELT 框架,典型组件是 DP Agent 与一组 Adapter,既能一次性加载也支持基于日志或 ODP 的近实时增量。
SDA 让 HANA 把 MySQL 和 PostgreSQL 这些外部数据库映射成虚拟表,查询时由 HANA 通过适配器与 ODBC/JDBC 去对接。ABAP SQL 通过标准连接即可读虚拟表。
如果大家对这种思路感兴趣,笔者后续也会专门写一篇文章介绍。
https://help.sap.com/docs/SAP_HANA_PLATFORM/6b94445c94ae495c83a19646e7c3fd56/a07c7ff25997460bbcb73099fb59007d.html