Microsoft Fabric Power BI で「 このビジュアルのデータを読み込むことができません」の対処例

## はじめに

新しく搭載された Power BI のストレージモードである Dircet Lake は非常にパフォーマンスよく鮮度の新しいデータを分析できるようになった一方で、そのアクセス制御には注意点があるので紹介します。

今回の記事は、
**The SELECT permission or external policy action 'Microsoft.Sql/Sqlservers/Databases/Schemas/Tables/Rows/Select' was denied on the object {テーブル名}**
か、類似のエラーが表示されたときに対処する例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/45efb3f7-d03a-3b2b-9510-25f1c9fabf7e.png)


注意：2024/01時点の情報です

### 参考

そもそも Power BI のストレージモードの違いを理解するとこの記事も読みやすいかと思います。

- [改めてPower BI データセットのストレージモードについて整理する](https://qiita.com/ryoma-nagata/items/0e8cce4497474df63839) ※データセットはセマンティックモデルの旧称です。
- [Power BI と Microsoft Fabric での Direct Lake について説明する - Power BI | Microsoft Learn](https://learn.microsoft.com/ja-jp/power-bi/enterprise/directlake-overview)

## エラー例

ウェアハウス、レイクハウスに初めから備え付けてある、セマンティックモデル（デフォルト）で、Direct Lake モードで動作するこんなレポートを作成したとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/24b689c6-a2fd-fa72-86e7-89a7d5f7a39a.png)

リネージはこんな感じ。セマンティックモデル（デフォルト）が利用されていると 原則 Direct Lake で動作しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/60b557d9-b329-b356-15fe-9001c0329b23.png)


このレポートを共有ボタンで直接共有します。（レポートの共有の仕方は様々ですが、今回は基になるウェアハウスなどには権限をつけないでレポートだけを共有した場合）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e4dc7df3-57b7-c4ff-df10-650fd08e249a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/971f06a9-157d-5fb9-54be-ed9c591298fe.png)


そうすると、共有された側でレポートを表示したときにこんな形でエラーが出ることがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/45cbe915-7b23-a3e4-b457-99366dbd086e.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/88737893-c2cc-2d11-eede-cfeabf03cb14.png)

## 何が起きているか？

Direct Lake モードではメモリにデータを展開する際にDirect Query 相当の操作が実行されているというイメージが良いかと思います。
つまり、セマンティックモデル（旧 Power BI データセット）から、OneLake上のファイルへのアクセスが実行されているということです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ef0b7d89-fe9c-e75f-f250-76f0e63a37d3.png)

その際、セマンティックモデル（デフォルト）のデータソースへのクエリはシングルサインオンでのアクセスとなっているため、今回のケースでは共有された側の権限でデータソースとなるOneLakeにアクセスしているという構図になります。

https://learn.microsoft.com/ja-jp/fabric/get-started/direct-lake-overview#known-issues-and-limitations

## 対処策

### ①データソースとなるウェアハウスへのアクセスも付与する

セマンティックモデル（デフォルト）をソースにした場合にはこの方向しかないかと思います。※個人的にはこの辺の取り回しがカスタマイズしにくいのて、セマンティックモデル（デフォルト）は正式なレポートには使わないほうがいいかなと思ってます。

ウェアハウスへの権限付与の参考：https://learn.microsoft.com/ja-jp/fabric/data-warehouse/share-warehouse-manage-permissions#share-a-warehouse

1. ウェアハウスの共有ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/dbe777ad-6d54-ab6b-3d3a-53e8c2ddacd4.png)
2. 対象のユーザーにアクセス権を付与します。今回はデータベース全体を閲覧してもよいよ、ということで、
「SQL を使用したすべてのデータの読み取り」をチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7b3f2879-d694-8520-c8a0-f29f72d8a1dc.png)

これで、レポートの共有相手はデータを表示できます。
なお、この方法では、SSMSウェアハウスへの直接の接続許可もしてしまうことに注意ください。

https://learn.microsoft.com/ja-jp/fabric/data-warehouse/connectivity

### ②データソースへの認証をシングルサインオン以外にする

前提が変わりますが、セマンティックモデル（デフォルト）でない場合には、データソースへの認証方法を設定変更できます。

（オプション）セマンティックモデルの作成

以下からも Direct Lake モードのセマンティックモデルを作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bfd57664-edfe-72e8-70c6-581dcfff7738.png)

この場合、ちょっとエラー表示が変わるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8721ea4c-387e-348a-cedf-a451f2aeac0b.png)

では対処です。

1. セマンティックモデルの設定を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c8a30100-28d4-d2f3-bf16-b0b0e62a8114.png)
2. ゲートウェイとクラウド接続を確認します。既定ではシングルサインオンとなっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/fa342d7d-a83f-30a3-5493-716767dd8996.png)

3. 個人用クラウド接続に変更すると、下部のデータソースへの資格情報でメッセージが表示されます。ので、資格情報を編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/874657dc-5e5c-adf2-b78d-ef0511db09be.png)

4. 認証方法を選択する画面が表示されるので、これを OAuth にしてサインインします。ここでサインインしたアカウントでの権限でセマンティックモデルからウェアハウスへのクエリが発行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/77d008be-bbaa-ec73-5248-f48ec2817352.png)
※下部のチェックをつけるとレポート参照者の権限でデータソースにアクセスするシングルサインオンの動作となります。

#### 接続を作成するを選択した場合

個人用クラウド接続とは別に接続を作成するという選択肢もありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/fa342d7d-a83f-30a3-5493-716767dd8996.png)

この場合、使いまわし可能な接続というオブジェクトというものを作成・使用することになります。
1. 接続を作成するを選択すると、作成画面に遷移します。この中の設定は個人用クラウド接続で資格情報を編集した際と同様です。（おそらく、これを使うメリットは今後洗練されていくのでここでは割愛）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ad292e69-df9e-862f-239f-05377bb0fbb6.png)
2. 作成するとセマンティックモデルに戻り、作成した接続を選択できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/db08fb12-4736-27b5-4e7d-9fd91e934de2.png)

3. 選択、適用すると、この接続に埋め込まれたアカウントの権限でセマンティックモデルからウェアハウスへのクエリが発行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8a844a23-feb2-7831-3a8b-9f0ca785dd6d.png)

### ③そもそもDirect Lake モードでセマンティックモデルを作成しない

Direct Lake は低遅延、高パフォーマンスというメリットを持つものですが、制限もあり、出たてということもあり情報も少ないため、使いどころは注意が必要です。
特に低遅延のメリットに関して、昨日のデータが見れればいい、ということであればそこまで大きなメリットはないかもしれません。（個人的にはインポートのスケジューリングが不要になるので、簡単なセマンティックモデルでは結構使いたい）

従来の Import or Direct Query のモードであれば、明示的に設定しない限りシングルサインオンという状態にはならないので、問題は起きないかと思います。