![見出し画像](https://assets.st-note.com/production/uploads/images/149225757/rectangle_large_type_2_a081a52379b72313bbc0a8d0ea533bb0.jpeg?width=1200)
ダイナミック・フィルタ:Tableauのユーザー関数を利用してログインユーザーに応じてフィルタの値を変更する
写真:ryo-yoshitake-cnIK3nLZ0Sg-unsplash
概要
今回はTableauのワークブックをTableau Server(Cloud)で閲覧する際に、ログインユーザーに応じて動的にフィルタの値を変更する手法についてお伝えします。やりたいことは、ログインIDと同じ所属の、他の人のレコードだけを表示して、異なる所属の他の人のレコードを表示しないという、行レベルのアクセス制御です。
※Tableau DesktopとTableau Server(Cloud)の環境があればハンズオン可能です。
背景
組織内でTableauを広く使おうとするとき、必ず課題に挙がるのがデータのアクセス制御です。データの最大の効果の一つは、組織横断的に情報を閲覧できるようになることです。一方で、意図的に情報の閲覧を制御しなければならない場合があります。
例えば、人事情報などの個人情報をプライバシーの問題から組織や役職に応じてアクセスを制限することが典型的だと思います。
その他、B2Bでは商品の原価情報をいたずらに営業部門に開示すると、客先からの値引き圧力に屈して安易に値引きに応じて利益を毀損する恐れがあります。そこで営業部門が閲覧できる値引き価格ライン(仕切り)を設定しておいて、それ以下の価格情報にはアクセスできなくすることで、利益を確保する、といった経営工学的な観点でのアクセス制御があります。
これらの課題に対して、Tableauを組織的に利用している場合には、3つのアプローチが考えられます。
1.データソース側の制御
1)データベース(データウェアハウス)製品を利用している場合
有料のデータベースであればスキーマやテーブル、列レベル、行レベルでのアクセス制御をかけることができます。また、ユーザー単位、ユーザーグループ単位で権限付与ができます。
データベース側でユーザーIDと所属情報を登録していてメンテナンスする必要があります。Tableau Server製品を利用している場合、データベース側とTableau Server側とIDの二重管理になる場合があります。
2)Tableau Desktopのみを利用している場合
データベースを利用していない場合、例えばデータソースがExcelやCSVであったり、抽出ファイルだった場合は、それらのファイルをユーザーIDと所属情報ごとに分割して保存する必要があります。例えばアクセス制御のかかったネットワークフォルダへの保存です。そのようにしない限り全てのユーザーが全てのデータにアクセスできてしまいます。
2.Tableau Server(Cloud)による制御
Tableau Server(Cloud)では、アクセス制御をパーミッションで行えます。プロジェクト(≒フォルダ)、ワークブック、ワークシート、データソースごとに閲覧や編集削除の制御が設定できます。また、ユーザー単位、ユーザーグループ単位で権限付与ができます。
一方で、パーミッションは細かくなりすぎて一覧性が悪く、管理し切れなくなるという難点があります。そして同じワークブックなのに、プロジェクトごとにデータを分けて保存するなどの運用形態が出てきてしまいがちです。
3.Tableau Server(Cloud) + ダイナミックにフィルタによる制御(今回の手順)
そこで、接続するデータベースのテーブルとTableauのワークブックは一つなのだけど、アクセスするユーザーによって見えるデータ(今回は行)をダイナミックに変える方法を検討することになります。制御用のマスターテーブル(この手順では社員マスター.csv)を別途用意する必要があります。今回はその手法の一つの事例です。
前提
・Tableau DesktopとTableau Server(Cloud)の環境が必要です。
・Tableau中級者やTableau Server管理者向けです。
用語
この手順で使う用語の解説です。
ログインID = Tableau Serverにログインする時のIDです。今回はログインID=メールアドレスであると想定します。
社員マスター = 下記のようなレイアウトの架空のテーブルです。
社員ID,組織,メールアドレス
00001,名古屋支店,nag_mun@yahoo.co.jp
00002,名古屋支店,koji.imada@knockknock.at
00003,大阪支店,koji.higashino@knockknock.at
00004,大阪支店,hanako@knockknock.at
00005,大阪支店,nagnag@knockknock.at
今回は一行目のメールアドレスがnag_munあっとyahoo.co.jpの名古屋支店の人と、五行目のnagnagあっとknockknock.at の大阪支店の人とで表示が変わるか検証します。
ハンズオンする場合、皆さまの環境に応じてメールアドレスの欄を、実際のTableau ServerのユーザーIDに変更して下さい。
手順
さっそくTableau Desktopでワークシートを作成していきましょう。
データの準備
社員マスター.csv をダウンロードしてTableau Desktopに読み込みして、ワークシートに移動して下さい。
フィールドの準備
下記3つの計算フィールドを作成して下さい。
ログインユーザーの組織
IF [メールアドレス] = USERNAME() THEN [組織] END
![](https://assets.st-note.com/img/1722486563235-oEuFZZDGIL.png?width=1200)
組織_ログインユーザーの組織
{ FIXED [組織] : MAX([ログインユーザーの組織]) }
![](https://assets.st-note.com/img/1722493266739-o8EV3Ant0z.png?width=1200)
組織が同一
[組織] = [組織_ログインユーザーの組織]
![](https://assets.st-note.com/img/1722493567647-BQ1ZIzpPph.png?width=1200)
ビューの作成
続いてビューを作成していきましょう。
社員マスタ.csv (カウント)をマークカードのテキストにドラッグ&ドロップして下さい。
データペインから次のフィールドを左から順に行シェルフに入れて下さい。
メールアドレス
ログインユーザーの組織
組織_ログインユーザーの組織
組織
ここまでで下図のような表示になります。
![](https://assets.st-note.com/img/1722498998248-4QIYN790di.png?width=1200)
6.続いて、フィルタに「組織が同一」のフィールドを入れて下さい。[組織]と[組織_ログインユーザーの組織]とが同じ値のレコードであれば真が返りますので、真にチェックを付けて下さい。
Tableau Server上でユーザーにこのフィルタを操作させないために、インタラクティブ・フィルタにはしないでください。
7.nagnagアットknockknock.atと同じ[組織]の大阪支店のレコードのみが選択されたことが確認できたらOKです。
パブリッシュ
上記で作成したワークブックをTableau ServerもしくはTableau Cloudにパブリッシュして下さい。
テスト
ここからは私の環境で結果を試してみます。今回は、nagnagあっとknockknock.at でログインしています。こちらのユーザーIDの所属は大阪支店ですから、同じく大阪支店に所属する人のレコードが表示されるはずです。
![](https://assets.st-note.com/img/1722503226607-NqvXFlKa8r.png?width=1200)
続いて、nag_munあっとyahoo.co.jp でログインしなおしてみます。こちらのユーザーIDの所属は名古屋支店ですから、同じく名古屋支店に所属する人のレコードが表示されるはずです。
![](https://assets.st-note.com/img/1722503413394-phWI3Pljx2.png?width=1200)
ログインユーザーに応じて社員マスター.csvを参照し、その[組織]の値によってレコードが選択されると確認できました。
以上で手順と確認は終了です。お疲れさまでした。
まとめ
Tableauの組織展開において管理工数は見て見ぬ振りを出来ない問題です。管理せずに放置すると複雑さが増し、把握できている範囲が狭まります。するとバージョンアップやデータベースの置き換えがスムーズにいかないおそれがあります。時間が経てば経つほど問題は大きくなります。下手すると誰も触れなくなり塩漬けシステムになるでしょう。適切なタイミングでの大小のメンテナンスが必要です。それには効率的な管理手法が欠かせません。今回のダイナミック・フィルタの手法を使うことで、プロジェクトやワークブックの増殖を抑えることができて、管理工数を下げることができます。
これ以外にも各組織では管理に工夫をこらしているものと思われますが、なかなか事例が出てこない領域と言えます。ぜひ研究して共有してみて下さい。