1. 主要ページへ移動
  2. メニューへ移動
  3. ページ下へ移動

QES ブログ

記事公開日

最終更新日

モデル駆動型アプリ概説 ⑨レコードの共有と割り当て

  • このエントリーをはてなブックマークに追加



こんにちは。システムソリューション営業本部の吾妻です。

以前、「モデル駆動型アプリ概説」連載の第5回目で、セキュリティロールを利用して、Dataverseテーブルでのアクセス制御を行う手順をご紹介しました。

今回は、その応用として、レコードの所有権を変更することによって、部署によらないアクセス制御を実現する方法について、簡単にご紹介していきたいと思います。




モデル駆動型アプリの作成手順(復習)

モデル駆動型アプリを作成するための手順として、以下のものがありました。今回は「レコードの共有と割り当て」の設定を行っていきます。

 手順 
 1. ビジネスデータのモデル化  
 2. ビジネスプロセスの定義 
 3. モデル駆動型アプリの作成 
 4. セキュリティロールの構成 
 5. アプリの共有 
 6. 応用的なカスタマイズ 
 7. ビューとフォーム 
 8. レコードの共有と割り当て(今回) 



用語

Dataverseレコードの所有権を、組織内の別のユーザーに渡したいときに利用できる機能として、以下の2つが用意されています。

詳細は後ほどご説明しますが、まずはこの2つの違いを掴んでおいてください。

  • レコードの共有
    …レコードの所有者が、所有権を保持したまま(=所有者のまま)、組織内の別のユーザーにレコードを操作させるための機能

  • レコードの割り当て
    …レコードの所有者が、組織内の別のユーザーに所有権を譲る(=所有者を変える)ための機能



セキュリティロールと部署

以前、第5回の記事でご紹介したように、Dataverseレコードのアクセス制御は、セキュリティロールDataverseの部署(やチーム)の組み合わせで設定して、レコードの所有者と照らし合わせて特権(読み、書き、削除など)の実行可否が判定されます。

特に、Dataverseの部署を予め定義しておいて、セキュリティロールのアクセスロールを「部署」や「部署配下」と設定しておくことで、自分自身が所有するレコード以外も操作することができるようになり、承認ワークフローをはじめとする、組織階層や役職を考慮したシステムを構築することができます。



しかし、実際に組織内でこれらのアクセス制御機能を利用したアプリを運用しはじめてみると、Dataverseの部署のメンテナンスを継続して行うのは、現実的には困難であると感じることが多いと思います。

なぜなら、Dataverseの部署を、(Power Platform管理センターから)Dataverseの中で設定しなければならないためです。



つまり、Entra IDでID管理している場合でも、人事情報を別システム(スクラッチ開発やパッケージ製品)で持っている場合でも、それらのマスタとは別に組織の情報をDataverse側で独立して管理する必要があり、運用コストが大きくなります。組織に所属しているユーザーの数が少なければ大した手間ではないかもしれませんが、ユーザー数が多く、組織階層が頻繁に変化する場合には、Dataverseの部署を利用しない方法も検討する必要があります。公式資料でも、部署(事業単位)の数は、最小限に抑えることを勧めています。



ちなみに、Dataverseの部署に所属するユーザーの同期だけ行うのであれば、グループチームを設定したり、Power Automateクラウドフローを作成したりと、いくつか方法がありますが、組織の階層構造を丸ごと自動的に同期するような機能は用意されていません。



共有と割り当て

このようにDataverseの部署を利用すると、運用コストが増大してしまうので、Dataverseの部署を利用せずに、所有者自身組織内の別のユーザーがレコードを操作できるようにしたいと思います。

基本的には、組織階層構造に関するマスタをDataverseに持たせる(=Dataverseの部署から、共同作業できる人を自動的に判別させる)のをやめて、利用者自身に「誰と共同作業するのか」を選ばせる方針とします。



その際、Dataverseに予め用意されている機能であるレコードの共有またはレコードの割り当ての機能を利用します。

どちらも、「組織内の別のユーザーがレコードの読み書きをできるようにする」ことは一緒ですが、元の所有者が所有権を持ったままなのか、所有権を手放すのかが異なります。

文章だけだと分かりにくいので、これ以降は、UIや実装例とともに、レコードの共有・割り当ての動作をご紹介したいと思います。



モデル駆動型アプリでのUI

モデル駆動型アプリには、既定の状態でレコードの共有や割り当てを行う機能が用意されています。そのUIと操作の例を以下に示します。



まず、モデル駆動型アプリを起動して、Dataverseテーブルのビューを開きます。共有または割り当てを行いたいレコードを1つ以上選択すると、コマンドバーの表示が切り替わり、「割り当てる」「共有」のコマンド(ボタン)が表示されます。
pashare01.png



このとき、非常に紛らわしいことに、コマンドバーの右端にも「共有」ボタンが表示されているのですが、こちらは「リンクを共有」するためのものです。

ただし、ビューではなくフォームから「レコードを共有」する場合は、こちらの「共有」ボタンをクリックして表示される「アクセスの管理」メニューを開くことで、次の「レコードの共有」パネルが表示されます。

若干混乱を招くUIになっていますが、気付かなかったことにして先へ進みます。




レコードを共有する

共有」をクリックすると、「レコードの共有」パネルが表示されます。共有相手と、付与したいアクセス許可(読み、書き、追加など)を指定します。既に作成されているレコードに対する操作なので、アクセス許可の選択肢に「作成」はありません。

pashare02.png


指定通りに共有されているか確認する際は、対象のレコードのフォームを開いて、コマンドバーにある「アクセスの確認」をクリックします。

pashare05a.png


既定ではユーザー検索欄に自分自身がセットされていますが、ここを共有相手に切り替えることができます。

pashare06a.png


「レコードは自分と共有済み」と表示され、付与したアクセスレベル(アクセス許可)が表示されていることを確認できます。

pashare08a.png


また、「アクセス権のあるユーザー」タブに切り替えることで、ユーザーを検索することなく一覧形式で確認することができます。一覧に表示されているユーザーをクリックすると、そのユーザーが選択された状態で「ユーザーの詳細」画面に切り替わります。

pashare07a.png


レコードを割り当てる

続いて、モデル駆動型アプリのビューに戻ってから、レコードを1つ以上選択して、「割り当てる」をクリックします。すると、「<テーブル名>の割り当て」ダイアログが表示されるので、「担当」を「自分」から「ユーザーまたはチーム」に変更して、割り当て先のユーザーを指定します。

pashare04.png


レコードの割り当ての場合は、ビューからすぐに結果を確認することができます。Dataverseテーブルには「作成者」列と「所有者」列がシステムで勝手に用意されますが、割り当てが正常に行われていれば、「所有者」の列が割り当て先として指定したユーザーに変化しているはずです。作成者の列は基本的には変更できない(Dataverseプラグインの実装など、作成者を変更する方法もあるにはあります)ので、作成者と所有者が異なっていれば、割り当て操作が行われたレコードだと考えて良いでしょう。

pashare03.png


Dynamics 365設定画面での割り当て

利用者が異動したり退職したりして、多数のレコードの所有者をまとめて変更したい場合には、Dynamics 365の設定画面から「再割り当て」することができます。



まずは、Power Appsメーカーポータルの右上にある歯車アイコンをクリックして、「詳細設定」メニューを選ぶことで、Dynamics 365の設定画面を開きます。

次に、ヘッダーの「設定」から「セキュリティ」をクリックします。



さらに、「ユーザー」で現在レコードを所有しているユーザーを開いて、リボンの「レコードの再割り当て」をクリックすることで、以下のようなダイアログが表示され、別のユーザーに再割り当てすることができます。



クラウドフローでの共有・割り当て

モデル駆動型アプリの画面からレコードの共有・割り当てを行うことはできますが、実際の運用としては、自分自身で直接このUIから共有したり割り当てたりすることは少なく、Power Automateクラウドフローで何らかの処理を行った結果として、(そのフローの中で)自動的に共有または割り当てを行わせたいという要件がほとんどだと思います。

そこで、クラウドフローを利用して、レコードを共有したり、割り当てたりする実装の例を示します。



共有 の場合

まず、クラウドフローを利用してレコードを共有する場合は、Dataverseコネクタの「バインドしていないアクションを実行する」アクションを使います。テーブルの論理名に複数形の「s」を付け忘れていないか、「有効な JSON」になっているか(「@」がエスケープされているか)、IDにGUID以外が指定されていないか、といったポイントに気を付けましょう。

pashare10a.png


「@」はこのアクションの中で直接記述するとエスケープする必要があったり、エディタが不安定でたまに勝手に書き換えられることがあったりするので、「変数を初期化する」で事前に文字列変数として定義しておいて、このアクションの中では動的なコンテンツとして配置したほうがスムーズかもしれません。



割り当て の場合

次に、クラウドフローを利用してレコードを割り当てる場合は、Dataverseコネクタの「行を更新するアクション」アクションを使います。「所有者」の列には、GUIDだけでなく、「/systemusers/」を付け足す必要があります。

pashare11.png


このように、モデル駆動型アプリのUIから操作することなく、クラウドフローの中で、レコードを共有したり、割り当てたりすることができます。

クラウドフローに組み込むことで、様々なトリガー条件で処理を実行させたり、条件分岐を加えたりすることができるようになるので、活用の幅が広がります。



応用例

承認ワークフローシステムを例として、要件に応じてレコードの共有や割り当てを実装する例を考えていきたいと思います。

実際の運用では多段階承認や差し戻しを考慮する必要がありますが、ここでは分かりやすさを優先して、申請者と承認1段のワークフローを前提とします。

また、セキュリティロールは、明記しない限り、自分自身が所有するレコードのみフルコントロール(読み書きなどすべて実行可能)となるように設定しているものとします。



以下の図では、ワークフローで申請されたデータの流れを太い矢印で、所有者や共有状況が切り替わるタイミングを錠🔒で示します。



まずは(A)申請者が送信した申請を、承認者が承認(更新)する場合を考えます。
 
この場合、申請者は申請内容を入力するときに、承認者は承認結果を更新するときに、それぞれ読み書きするアクセス許可が必要になります。
 
一番簡単に実現できるのは、申請者がレコードを保存したタイミングで、所有者を申請者から承認者に変更することです(レコードの割り当て)。ただし、変更したあとは、申請者がこのレコードを閲覧することができなくなります。
 
 
 
そこで、(B)申請者が申請結果を閲覧し続けられるようにする方法を考えます。
 
1つ目は、申請者がレコードを保存したタイミングで、(A)と同じように所有者を申請者から承認者に変更しつつ、申請者に読み取り許可のみ付与してレコードを共有する方法です。
 
2つ目は、申請者が直接レコードを作るのではなく、自動フローで承認者の権限で空のレコードを作成して、申請者が申請するまでの間(申請内容を入力して保存するまでの間)だけレコードを共有する方法です(ただし、申請者と承認者の対応関係がマスタで管理されていて、かつ承認者の数が少数でないと採用しにくいです)。
 
どちらも、承認が済んだあとでも引き続き申請者がこのレコードを閲覧できるようになりますが、承認者が、一度承認した後でもレコードを変更できてしまうので、改竄のリスクがあります。



これを解決するために、(C)承認処理が一通り完了したら、申請者も承認者も書き込みできないように制御する方法を考えます。

1つ目は、セキュリティロールで「作成」「追加」「追加先」のみ付与するとともに、申請情報と承認状況を管理するテーブルを分離して、一対多のリレーションを張る方法です。レコードを編集・削除できないようにすることで、後から申請・承認結果を改竄したり、なかったことにしたりすることができなくなります。

ただし、当然承認処理が行われる前であっても申請内容を編集することはできなくなるので、すべてのレコードを履歴テーブルとして管理する必要があり、レコード数が増大するリスクがあります。

また、アクセス許可を「作成」のみで「編集」を付与しない場合には、ファイル列および画像列(のうち、プライマリイメージでないもの)にファイルを登録できなくなるというデメリットもあります。これは、Dataverseのファイル列では、一行テキスト型や整数型などのデータ型の列とは異なり、カスタムテーブルとリレーションが張られたFileAttachmentシステムテーブルでメタ情報を管理する仕様であり、いったんレコードを保存(=作成)するまで、ファイルをアップロードできないためです。つまり、ファイルをアップロードしてファイル列に追加するためには、ファイル列以外の列に値を格納して、レコードを保存してから、ファイルをアップロードして、レコードを保存(=編集)する、という手順が必要なので、「編集」が付与されていない場合には、後段が実行できず、結果としてファイル列にデータを格納できないことになります。

2つ目は、承認処理が済んだタイミングで所有者をシステムアカウントに変更する方法です。(B)-2の応用で、最初からシステムアカウントの権限でレコードを作成しておいて、レコードの共有相手を(申請者・承認者に)都度切り替えながら承認プロセスを進める実装も考えられます。この場合は、Power Automateクラウドフローで、レコードの共有や割り当てを頻繁に行うことになります。そのため、クラウドフローが、Power Platform 要求の制限をはじめとする各種制限に抵触するリスクがあります。



このように、部署を利用するよりも詳細かつ厳密にアクセス制御を行いたい場合は、レコード所有者の切り替えと、レコードの共有・割り当てを組み合わせることで実現します。一方で、厳密に管理しようとすると運用面やパフォーマンス面で課題が出てくることもあるので、要件に応じてどこまで管理するか検討する必要があります。



まとめ

今回は、Dataverseテーブルのレコードを、共有したり割り当てたりする際の考え方と実装例について、簡単にご紹介しました。

QES では Power Platform の開発支援、QAサポート、開発者教育、ガバナンス整備など、組織で Power Platform を活用するためのサポートを包括的にご提供しています。Power Platform 活用についてご興味がある/利用中だが課題を感じていらっしゃるお客様はまずはお気軽にお問い合わせください。




このブログで参照されている、Microsoft、Windows、その他のマイクロソフト製品およびサービスは、米国およびその他の国におけるマイクロソフトの商標または登録商標です。

  • このエントリーをはてなブックマークに追加

お問い合わせ

Contact

ご質問やご相談、サービスに関する詳細など、何でもお気軽にご連絡ください。下記のお問い合わせフォームよりお気軽に送信ください。

お問い合わせ

資料ダウンロード

Download

当社のサービスに関する詳細情報を掲載した資料を、下記のページよりダウンロードいただけます。より深く理解していただける内容となっております。ぜひご活用ください。

資料ダウンロード