DBスキーマ内のDBオブジェクト (テーブルやビューなど) に対して、HDI( SAP HANA Deployment Infrastructure) コンテナーからアクセスする方法について解説いたします。
対象者は「SAP HANA Cloud(以下、「HANA Cloud」 )の基本的な操作を理解している方」になります。
※ 実際に下記の手順を試す場合は、こちらのBlogの内容で事前に環境を準備してください。
HDI コンテナー内でテーブル定義もCalculation View 定義もその他の定義ファイルも全部セットにしてDBアプリケーションを開発する場合は、基本的に今回の作業は必要ありません。
ただし、HANA Cloudのデータ連携機能を利用したり、シンプルなDBとして使用する際にはHDIコンテナーの仕組みを利用しない方がラクチンなケースもあります。
一方で、HDIコンテナーの仕組みが必要なケース( Calculation Viewを使用するなど) もあり、その際にはHDIコンテナーから通常のスキーマのオブジェクトにアクセスする設定が必要になります。
HDI コンテナーの独立性は恐ろしいほどに厳格なので、外部のリソースに対してのアクセスはDBエンジニアにとっては回りクドイ感じがしますが、SAP HANA Cloudの小粋で便利な機能を利用するためには必須の知識になるので、今回の「お作法」を知っておきましょう。
大まかな流れは下記の通りです。
1. スキーマ管理者がHDIコンテナーに対して権限付与
2. テーブルに対してのシノニムを作成(※)
※ シノニム : DBの用語でテーブルやビューに対して付ける「別名」のこと。「エイリアス」と言った方が分かり易いかもしれません。
具体的な設定の流れ
具体的な設定の手順は下記の通りです。スキーマ名やHDIコンテナーのスキーマ名なども確認しながら、大まかな設定手順の流れをイメージしてください。
1. HDIコンテナーに権限付与するための設定
(1) User-Provided サービスの作成
(2) 権限ファイルの編集と権限付与
2. シノニムの作成
1. HDIコンテナーに権限付与するための設定
(1) User-Provided サービスの作成
SAP Business Application Studio (以下、「BAS」) の左下の「Database Connections」 の右の「+」マークをクリックしてUser-Provided サービスを作成します。
下記の図の通りに入力しますが、サービス名は分かり易いように「order-entry-schema-service (ORDER_ENTRYのスキーマにアクセスするためのサービス) 」としています。
また、HDIコンテナーにアクセス権限を付与するのは、ORDER_ENTRYユーザーなのでユーザー名とパスワードを指定します。
ここでのポイントは「Generate hdbgrants file」をチェックすることです。後ほど、HDIコンテナーに対してORDER_ENTRYユーザーが付与する権限を指定するための権限ファイルを自動生成する指定になります。
「Database Connections」配下に「cross-container-service-1」という名前のサービスが追加されます。
「ん? 何だ 、これ?」 と混乱してしまうので、名前を変更します。mta.yamlファイルをクリックして設定ファイルを編集します。mta.yamlファイルの中の「cross-container-service-1」を「order-entry-schema-service」に修正します。
表示名が修正されたら、右の「Bind」マークをクリックして先ほど作成したUser-Provided サービス「order-entry-schema-service」と関連付けます。
(BASからorder-entry-schema-serviceに対してアクセスするための設定、とご理解ください)
(2) 権限ファイルの編集と権限付与
次にHDIコンテナーに付与する権限のファイルを編集します。先ほど作成したUser-Providedサービスと同じ名前の権限ファイル(*.hdbgrants)が作成されるのでクリックしてファイルを開きます。
2行目に”ServiceName_1“とあるので、分かり易くUser-Providedサービスと同じ名前の”order-entry-schema-service“に修正します。
※ “ServiceName_1“のままでも、mta.yamlファイル内のプロパティで”ServiceName_1“と関連付けているので動作としても大丈夫ですし、あえて、修正しない方がUser-Providedサービス名変更の際には運用がラクチンですが、今回は基本的な関連付け、動作を理解いただくためにサービス名を修正しています。ちなみにmta.yamlファイル内の”ServiceName_1“はそのまま修正しなくても大丈夫です。そのブロックの “- name: order-entry-schema-service“を直接参照するためです。
デフォルトの権限は下記の通り、SELECT, INSERT, UPDATE… と一通りのスキーマオブジェクトに対しての操作権限が付与されていますが、もし、検索権限のみ付与したい場合は、SELECT 以外の記述を削除します。
「object_owner」と「application_user」の記載がありますが、今回、特に気にする必要があるのは 「object_owner」です。この「object_owner」に指定した権限が「HDIコンテナー(のオブジェクトオーナー)」 に対して付与されます。
ファイルが修正できたら、このファイルを選択して、デプロイします。
ちなみに 権限を剥奪する(Revoke)場合は、別途、*.hdbrevokes ファイルを作成して、*.hdbgrants ファイルと同じフォーマットで、取り消す操作を指定します。
*.hdbgrantsファイルから剥奪したい操作を削除して再デプロイしても権限は剥奪されませんので、注意してください。
2. シノニムの作成
DBスキーマ内のテーブルに対してのシノニムを作成します。
メニューの「View」 > 「Find Command…」を選択し、検索ボックスに「HANA C」と入力して表示された「SAP HANA Create SAP HANA Database Artifact」を選択します。
Artifact type に「Synonym」を指定し、ファイル名は分かり易いように「order-entry-schema (ORDER_ENTRYのスキーマ内のオブジェクトに対するシノニム定義)」とします。
作成されたファイルをクリックしてシノニム定義の編集を行います。
まずはORDER_ENTRYスキーマ内の「CUSTOEMRS」テーブルに対してシノニム名を付けますが、テーブルと同名のシノニム名を付けますのでシノニム名を「CUSTOMERS」と修正します。
その後、ORDER_ENTRYスキーマのオブジェクトを選択するために「…」をクリックして設定画面を開きます。
設定画面では、「Service:」のプルダウンリストから、先ほど作成したUser-Providedサービス「order-entry-schema-service」をチェックして、このサービス経由でORDER_ENTRYスキーマ内のオブジェクトにアクセスします。
検索ボックスにて「CUSTOMERS」と入力して、ORDER_ENTRYスキーマ内の同テーブルが表示されたらチェックしてFinishボタンをクリックします。
これで、ORDER_ENTRYスキーマ内の「CUSTOMERS」テーブルに対して、同名の「CUSTOMERS」シノニムが出来ました。
同じ手順で、「PRODUCTS」テーブルと「ORDERS」テーブルに対しても同名のシノニムを付けましょう。
今回は3つのテーブルに対してのシノニム作成だったので、1つずつ作成しましたが、オブジェクト数が多い場合は「マス・インポート」の方法があるので、対象スキーマを選択してスキーマ内の全てのオブジェクトに対して同名のシノニム名を付けましょう。
参考までに生成されたファイルの中身をCode Editor で確認してみてください。
シノニム名の定義ファイルの編集、確認ができたら、デプロイします。
それでは、シノニム経由でORDER_ENTRY のテーブルにアクセスできるか確認してみましょう。
BASからSAP HANA Database Explore に遷移して(Database ConnectionsからOpen HDI containerボタンをクリック)、「Synonyms」を選択して、「CUSTOMERS」をクリックしてCUSTOMERSの定義情報を確認後、右クリックで「Open Data」を選択してCUSTOMERSテーブルの内容が確認できたかと思います。
運用時の注意事項
User-Provided サービスの詳細情報を確認すると認証情報が確認できるのですが、その設定情報には、ORDER_ENTRYユーザーのパスワードが平文で記載されています。
HDIコンテナーからORDER_ENTRYのログイン設定をするので、HDI管理者はその情報を知っていることになりますし、見ることも可能なのですが、あまり気持ちの良いものではありません。
開発環境はともかく、本番環境においては、このDBユーザーのパスワードの公開を制限するために、サブアカウント内の領域(スペース)にユーザーを追加する際には、パスワードを見せたくないユーザーに対してはロール割当として、「領域の監査人」の権限を割り当てることで、パスワードを非公開にすることができます。
※ Subaccount Viewerというロールをユーザーに割り当てると、そのユーザーはサブアカウントに対して参照アクセスが可能になりますが、この状態でもスペース自体にそのユーザーを割り当てなければ、スペースで作成されているサービスインスタンスの情報(サービスキーの情報含めて)は見ることができません。ただ、この状態ではスペースに入れないので、スペース上で動作しているアプリケーションの状況も含めて何も確認できないので、ちょっとイマイチです。
なので、上記の「領域の監査人」ロールを割り当てる方法が一番理想的かと思います。この辺りの設定についてはBTPの運用周りに詳しい人にご相談ください (私も詳しい人に教えてもらいました)。
< 参考情報 >
Access a Classic Schema from SAP Business Application Studio