** 本文参考: **
https://blogs.sap.com/2014/02/14/sap-hana-smart-data-
access-%E4%B8%80-%E5%88%9D%E8%AF%86sda/
https://help.sap.com/docs/SAP_HANA_PLATFORM/0eec0d68141541d1b07893a39944924e/109397c2206a4ab2a5386d494f4cf75e.html?version=2.0.03&locale=en-
US
HANA
DB中,有一些视图通过函数SESSION_CONTEXT来限定客户端号的读取,其中参数CDS_CLIENT会在读取数据时获取指定的客户端号。但如果不指定,那么取到的值就为空。
我们现在通过SDA(Smart Data Access)的方式来指定客户端号。
SDA是SAP HANA访问SAP HANA Database以外数据源的一种数据访问技术。利用SDA,SAP HANA可以建立虚拟表(virtual
table)映射到远程数据源,进而通过虚拟表访问远程数据源中的数据。SAP
HANA可以像操作本地表一样操作虚拟表,如查询、更新、插入、删除等操作均适用于虚拟表。SDA支持本地表和虚拟表的连接,查询优化器将相关操作发送到远程数据源,远程数据源完成操作后将结果数据集返回给SAP
HANA做进一步处理。
SDA在SAP HANA SPS06版本中被引入,最初支持的数据源有:SAP HANA、SAP Sybase ASE、SAP Sybase
IQ、Teradata
database以及Hadoop。SPS06中的SDA仅支持对虚拟表的读操作。SPS07版本丰富了SDA的数据源类型,增加了对MSSQL
Sever、Oracle等数据源的支持,且允许对虚拟表的写操作。
本次操作是HANA远程访问自己,并带上指定客户端号的语句来实现取到指定客户端数据的需求。
警告!本次操作需要最大权限账号 **SYSTEM** ,请谨慎操作!
第一步,配置远程访问账号的权限
登录要远程访问的HANA DB,打开 **Security** \- **Users**
,找到稍后要进行远程登录的账号,给予要读到的数据库表的权限,比如本次的目标,是 **SAPHANADB** 这个数据库中的视图 **FAAV_ANLC**
。这里因为是方便外围系统读取数据,所以只给读取权限。
设置完成后F8保存。
第二步,创建数据源
使用 **SYSTEM** 账号登录我们本地的系统,右键点击 **Provisioning** \- **Remote Sources** ,选择
**New Remote Source...** 。
下面介绍一下需要填写的项目
Source Name:远程连接的名称,大小写都可以
Adapter Name:选择远程数据库的类型,本次访问的是HANA数据库,所以选择HANA(ODBC)
Server:远程Hana数据库的地址
Port:远程Hana数据库的地址端口
DML Mode:允许远程方式读写或只读
Extra Adapter Properties:可以输入一些特定的参数指定,本次需要指定CDS_CLIENT的值,所以填写:
**SESSIONVARIABLE:CDS_CLIENT=_ < _ _你要指定的客户端号 > _ **
User Name和Password:登录远程数据库的账户和密码。我们这里配置第一步的账户密码。
设置完成后F8保存。之后我们就可以在下拉菜单中看到我们访问的远程数据库。
第三步,创建虚拟表
在HANA Studio中建好数据源后,可以将数据源中的表映射为SAP HANA中的虚拟表。
因为大概率在下拉中你是看不到你要映射的表,这里直接介绍语句创建的方法。
*
CREATE VIRTUAL TABLE <table_name> <remote_location_clause>
示例:
*
CREATE VIRTUAL TABLE SAPHANADB.VT_ANLC AT“REMOTE_SOURCE”.”NULL”.” SAPHANADB”.” FAAV_ANLC”;
解释:
SAPHANADB.VT_ANLC:这里点左边的部分是远程数据库服务器上的指定数据库,右边是表名。语句执行后会在指定数据库中创建这个虚拟表。表明不可以和现有的表重复,数据库是要求指定已经存在的。
“REMOTE_SOURCE”.”NULL”.” SAPHANADB”.”
FAAV_ANLC”:这一部分和你创建的远程源有关系,按照菜单的层级抄下来就可以,用双引号括起来,用.分隔。
F8执行语句,虚拟表就创建好了。使用的时候,我们可以直接访问虚拟表,系统会系统从远程数据库取数、输出结果。
那么现在我提问,如何使用JDBC指定CDS_CLIENT读取HANA数据库?
答案很简单,在调用的地址上附加: ** &sessionVariable:CDS_CLIENT=<你要指定的客户端号> **
** 你学废了吗? **