Technical Articles
はじめてのSAP HANA Cloud : HDIコンテナーからDBスキーマにアクセスする
※ 最新の情報はこちらのBlogをご確認ください。
DBスキーマ内にDBオブジェクト (テーブルやビューなど) に対して、外部のHDIコンテナーからアクセスする方法について解説いたします。
対象者は「SAP HANA Cloudの基本的な操作を理解している方」になります。
※ SAP HANA Cloudに関しての基本的な操作やDBアプリケーションの作成方法については下記のブログを参考にしていただけたらと思います。
・はじめてのSAP HANA Cloud (Part 1 – Part 5)
・Free Trialではじめる、SAP HANA Cloud
・はじめてのSAP HANA Cloud : HDIとDBアプリケーションのデプロイ
今回は、少々、複雑で難解です。
HDI コンテナー内でテーブル定義もHANA View 定義もその他の定義ファイルも全部セットにしてDBアプリケーションを開発する場合は、今回の作業は基本的には必要ありません。
既にテーブルをDBスキーマ内に作成し、そのテーブルをベースにしたHANA View を作成する場合には、今回の構成と設定が必要になります。
HDI コンテナーの独立性は恐ろしいほどに厳格なので、外部のリソースに対してのアクセスはDBエンジニアにとっては回りクドイ感じがします。
ただ、HANA View やSDI (Smart Data Integration )などのSAP HANA の小粋で便利な機能を利用するためには必須の知識になるので、今回の「お作法」を知っておきましょう。
大まかな流れは下記の通りです。
1. DBスキーマ内のオブジェクトに対するアクセスを可能とするロール(※)を作成する
2. そのロールをHDI コンテナーに付与する
3. HDI コンテナー内にDBスキーマ内のテーブルに対するシノニム(※)を作成する
※ ロール : DBの用語で権限をまとめたオブジェクトのこと。権限管理を容易にする仕組み。
※ シノニム : DBの用語でテーブルやビューに対して付ける「別名」のこと。「エイリアス」と言った方が分かり易いかもしれません。
今回も「はじめてのSAP HANA Cloud」シリーズをベースに解説します。
下記の「はじめてのSAP HANA Cloud」シリーズ、もしくは「Free Trialではじめる、SAP HANA Cloud」シリーズの手順を振り返ります。
今回の手順は、
・Part 1 ~ HANAインスタンスの作成 ( 商用環境編 , Free Trial 編 )
・Part 2 ~ テーブルとビューの作成
・Part 3 ~ SAP Web IDEの設定とプロジェクト作成 ( 商用環境編 , Free Trial 編 )
・Part 5 ~ Web IDEを使用した、HANA Viewの作成
の流れで、「Part 4 をスキップして Part 2 で作成したテーブルに対してPart 5の手順でHANA Viewを作成する」イメージです。
今回は、前出のブログを見ながら頑張ってテーブルやHANA View を作成してきた方々を優先したいと思いますので、まずは本編に入る前に環境の準備から入りたいと思います。
※ まだ、上記の手順を試しておらず、HDI コンテナー内にテーブル作成する手順をスキップしたい方は、上記のPart 1 – Part 3までを実行し、下記の「いよいよ始めます、具体的な設定の流れ」に進んでください。
SAP HANA Cloud の環境を整える
「はじめてのSAP HANA Cloud : HDIとDBアプリケーションのデプロイ」の後半部分を参考にまずは既存のHDIコンテナーを削除します。ちょっと抵抗があると思いますが、DBアプリケーション(定義情報)が残っていればいつでも再作成できるので安心してください。
次にHANA Viewの定義やテーブルの定義などのプロジェクトファイルをバックアップします。
「order-entry」プロジェクトを選択し、右クリックで「Export」を選択します。そして、「order-entry」プロジェクト内のテーブル定義ファイルやHANA Viewの定義ファイルがzipファイルで固められますので、ローカルPCに保存しておきます。
次にテーブル定義のファイルを削除します。下記の3つのファイルです。
・customers.hdbtable
・products.hdbtable
・orders.hdbtable
対象のファイルを選択し、右クリックで「Delete」を選択します。
これでプロジェクト内からテーブル定義のファイルがなくなり、HANA Viewの定義ファイルだけとなりました。それでは、いよいよ、今回の手順に入っていきましょう。
いよいよ始めます、具体的な設定の流れ
具体的な設定の手順は下記の通りです。スキーマ名やHDIコンテナーのスキーマ名なども確認しながら、大まかな設定手順の流れをイメージしてください。
1. ロールの作成
2. ロールをHDIコンテナーに付与するための設定
3. シノニムの作成
1. ロールの作成
ORDER_ENTRYのDBスキーマの所有者である、ORDER_ENTRYユーザーで、DBオブジェクトにアクセス可能なロールを作成します。
今回はHANA Viewを作成することが目的なので、SELECT権限のみとします。
まずはORDER_ENTRY ユーザーがロールを作成できるように、DB管理者であるDBADMINユーザーで権限付与を行います。
-- ROLE 管理権限の付与
GRANT ROLE ADMIN TO ORDER_ENTRY;
権限付与が完了したら、ログアウト(Credentialをクリア)して、ORDER_ENTRY ユーザーでログインし、Database Explorer (SQL Console) を開きます。
アクセス権限を付与したロールを作成します。
今回は2つのロールを作成し、1つは「 with grant option」 を付けたものになります。
(「with grant option 」 を付与された人は、さらに別の人に権限付与できる、という設定になります)
この2つのロールを作成することは「お作法」になりますので、憶えておいてください。
-- ORDER_ENTRY スキーマーへの参照(SELECT)権限ロールの作成
CREATE ROLE "order-entry::external_access_g";
CREATE ROLE "order-entry::external_access";
GRANT SELECT, SELECT METADATA ON SCHEMA ORDER_ENTRY TO "order-entry::external_access_g" WITH GRANT OPTION;
GRANT SELECT, SELECT METADATA ON SCHEMA ORDER_ENTRY TO "order-entry::external_access";
2. ロールをHDIコンテナーに付与するための設定
理屈を先に説明したいところですが、まずは設定しながら慣れることが大事です(そんな乱暴な解説ってアリなのか !? )。
下記のステップで進めていきます。
(1) User-Provided サービスの作成
(2) HDIコンテナーに付与するロール名の指定
(3) HDIコンテナーへのUser-Provided サービス登録
(1) User-Provided サービスの作成
SAP Cloud Platform Cockpitを使用して、「User-Provided サービス」を作成します。
この 「User-Provided サービス」が何者なのかの説明は、まずは置いておきますが、HDIコンテナー ( order-entry-hdidb ) から、「ORDER_ENTRY」ユーザーでDBにログインするために必要な仕組みになります。
手順としては、左メニューの「User-Provided Services」を選択し、「New Instance」のボタンをクリックします。
サービス名には 「order-entry-schema-service」という名前を付けます。
「ORDER_ENTRYスキーマに対してのアクセスできるサービス」という意味を込めています(そのままですけど)。
「Credentials 」には、DBに対しての接続情報を下記のフォーマットで記載します。
<password>の部分は実際に使用しているパスワードに書き換えてください。「” (ダブルクォーテーション)」は必要です。
「Save」ボタンをクリックして保存します。
{
"user": "ORDER_ENTRY",
"password": "<password>",
"schema": "ORDER_ENTRY",
"tags": ["hana"]
}
この時点で少しモヤモヤしますが、先に進みます。
(2) HDIコンテナーに付与するロールの指定
次にHDIコンテナーに付与するロールを指定します。
正確には、HDIコンテナーにロールを付与するのではなく、HDIコンテナー内に作成されている「オブジェクトオーナー(所有者)」のDBユーザーに対してロールを付与します。
HDIコンテナー内のオブジェクトオーナーのDBユーザー名は今回の例では、「ORDER_ENTRY_HDI#OO」になり、「<HDIコンテナーのスキーマ名>#OO」で表現されます。「OO」は「Object Owner」の意味です。
src フォルダを選択し、「New」 > 「File」 で 「order-entry-schema.hdbgrants」 というファイルを作成します。
このファイルの拡張子の「.hdbgrants」 はとても重要なので、タイプミスに気を付けてください。
ファイル内では下記のフォーマットでロールを記載します。
{
"order-entry-schema-service": {
"object_owner": {
"roles": [
"order-entry::external_access_g"
]
},
"application_user": {
"roles": [
"order-entry::external_access"
]
}
}
}
先頭の「order-entry-schema-service」は、先ほど作成した「Use-Provided サービス」です。
「object_owner」と「application_user」の記載も大事で、今回、特に気にする必要があるのは 「object_owner」です。
この「object_owner」は「HDIコンテナーのオブジェクトオーナー」の事を指します。
色々な環境にこのDBアプリケーションやDB設定をデプロイできるように、あえて、「object_owner」と記載します。
説明されるまで直感的にわからないのがモヤモヤしますが、説明されると「なるほど~~~」とご理解いただけると思います。
ちなみに「application_user」の詳細な説明は今回は割愛しますが、その名の通り、「アプリケーションユーザーに付与するもの」です。
(また、いずれ説明する日が来ると思います)
そして、この「object_owner 」に対しては、grant option付きの「order-entry::external_access_g」を指定し、application_user に対しては「order-entry::external_access」を指定します。
これも「お作法」になりますので、憶えておいてください (アプリケーションユーザーが勝手に権限付与しまくったら困る、と憶えてください)。
(3) HDIコンテナーへのUser-Provided サービス登録
次に ( 最近、マイブームの) ヤムルファイル(mta.yaml)の設定です。
下記の赤字の部分を追記します。
----------- modules に追記する内容 -----------------
properties:
TARGET_CONTAINER: '~{hdi-container-name}'
- name: order-entry-schema-service
----------- resources に追記する内容 ---------------
- name: order-entry-schema-service
type: org.cloudfoundry.existing-service
----------------------------------------------------
「User-provided サービス」で作成した「order-entry-schema-service」を追記することに加えて、HDIコンテナーの「properties」も追記しないとエラーになりますので、まずは何となく意味とお作法を理解した上でSaveします。
これらのサービスや設定ファイルで指定した名前の関係を整理します。
勘の良い方は、また、「なるほど~~~」と理解されたと思いますが、私は勘が悪いので、この複雑さに慣れるまでに時間が掛かりました。
要は、設定ファイルの修正だけで、色々な環境に対して簡単にデプロイができることがメリットなので、アプリケーションのポータビリティが物凄く上がります。
そのトレードオフとして、初期フェーズでは憶えなくてはいけないお作法があり、少しゲンナリしますが、身体に染み込ませるとだんだん慣れてきますので、まずは慣れるまで頑張ってみてください。
それでは、下記の図の手順でBuildして「一番メンドクサイ」操作手順は完了です。
参考までにSAP HANA Cockpitでロールの検索をすると、「order-entry::external_access_g」 がHDIコンテナーのDBスキーマのオブジェクトオーナー 「ORDER_ENTRY_HDI_1#OO」に付与されていることが確認できます。
※ なぜ、「_1 」になっているのかはこちらのブログで解説しています。
ここまで来たら、後は楽チンなので、リラックスして手順を進めてください。
3. シノニムの作成
DBスキーマ内のテーブルに対してのシノニムを作成します。
src フォルダを選択し、「New」 > 「Database Artifact」 で 「order-entry-schema.hdbsynonym」 というファイルを作成します。
シノニム名とその参照先のスキーマ名、オブジェクト名を追記します。
下記の図の通りに記載してSaveしてください(シノニム名はこちらのブログで使用したテーブル名と同じにします)。
■ シノニム名 : order-entry.db::customers
– スキーマ名 : ORDER_ENTRY
– オブジェクト名 : CUSTOMERS
■ シノニム名 : order-entry.db::products
– スキーマ名 : ORDER_ENTRY
– オブジェクト名 : PRODUCTS
■ シノニム名 : order-entry.db::orders
– スキーマ名 : ORDER_ENTRY
– オブジェクト名 : ORDERS
Save後、一旦、タブを閉じて、念のため、コードエディターで内容を確認します。
内容を確認したら、Build します。
Build したら、対象ファイルを選択し、右クリックで「Open HDI Container」を選択して、Database Explorer に切り替えます。
※ 自動的にアクセスするDB(HDI コンテナー)をDatabase Explorerに追加します。
左のリストから「Synonyms」を選択し、「customers」 シノニムを選択してシノニムの設定内容を確認します。
そして、右上の「Open Data」 アイコンをクリックしてシノニム経由でテーブルデータにアクセスできることを確認します。
HANA ViewのRebuild
以前に作成したHANA Viewを再利用します。
今回作成したシノニム名は、以前に指定したテーブル名と同じ名前にしています。
まずは、「d_customers 」 ビューを選択して、テーブル名とシノニム名が同じであることを確認して一つずつBuildします。
d_products ビュー、v_orders ビューも順番にBuildしましょう。
Build が完了したら、Database Explorer に移動して、v_orders ビューの内容を確認しましょう。
今度、HANA View を作成する時は
今回は、一連の流れで「はじめてのSAP HANA Cloud」シリーズでステップを踏んできましたが、この方法に慣れた人は、「HDIコンテナー内にテーブルを作成せずに、DBスキーマ内に作成したテーブルに対してシノニムを作成してHANA Viewを作成」してみてください。
その際にテーブルを指定する代わりに、シノニムを指定するのですが、下記の画面のように「External Services」で「order-entry-schema-service」にチェックを入れて、対象テーブル(のシノニム)を検索してください。
いかがでしたでしょうか ?
(ちょっと難しかったですよね… わかります…)
ただ、HANA View は通常のSQL Viewにはできない、様々な拡張機能があります。
また、Smart Data Integration (SDI) 機能を使って、他システムとの連携やELTの処理もGUIベースで行うことができます。
その他のケースとして、プロジェクト内で、DB設計とアプリケーション開発を別グループで平行して進めなければいけない状況もあるかと思います。
HANA Viewなどの「DBアプリケーション」の開発/実行のため、そして、プロジェクトの状況によっては、今回のナレッジは重要になってくると思いますので、是非、HDI コンテナーには少しずつ慣れていただくようにお願いいたします。
今後は、「HANA Viewではどんな凄いことができるのか ?」の解説や「SDIで他のシステムと連携してELT処理を行う」方法なども解説していく予定です。
SAP HANA や SAP HANA Cloud が、今までのDB とは違う魅力がたくさんあることをこれからもお伝えしていきたいと思いますので今後ともよろしくお願いいたします。
ありがとうございました !!
< 参考情報 >
Enable Access to Objects in a Remote Classic Schema
HANA Cloud: Access Schema from HDI Container