データシェアリング先のアカウントで閲覧可能なオブジェクトをパターン分けさせたいときに役立つ「Database Roles」を試してみた #SnowflakeDB

2023.04.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

さがらです。

Snowflakeにおいて、2022年12月に「Database Roles」という新しいロールがパブリックプレビューとなりました。(2023年4月17日時点でも、パブリックプレビューです。)

このDatabase Rolesを試してみたので、本記事で内容をまとめてみます。

Database Rolesとは

2022年12月のリリースノートにDatabase Rolesの機能の特徴やユースケースがまとまっておりますので、こちらの内容を元にDatabase Rolesについて説明します。

Database Rolesとは、あるデータベース内のオブジェクトに関する権限を付与できるロールのことです。具体的にはスキーマへのUSAGE権限や、テーブルへのSELECT権限です。

こう聞くと、「あれ、今までのロールと何が違うの?」となると思いますが、差別化ポイントは以下になります。

  • データベースの共有前にDatabase Rolesを作成しておけば、コンシューマー側がそのDatabase Rolesを使ってスキーマやテーブル単位で細かく権限付与できる
    • 従来のロールだとデータシェアリングで共有されたデータベースを参照させるにはIMPORTED PRIVILEGES権限を付与するしかなかったため、共有されたデータベース内の全てのオブジェクトに対する参照権限をまとめて付与することしかできなかった
  • Database Rolesは対象のデータベースの所有者が作成できるため、対象のデータベース内の権限管理を所有者に委譲できる
    • ただ、Database Rolesは直接ユーザーに付与してアクティブ化できないため、Database Roles作成後は従来のロールに付与する必要がある

個人的には、「データベースの共有前にDatabase Rolesを作成しておけば、コンシューマー側がスキーマやテーブル単位で細かく権限付与できる」ことが大きいと思っています!企業間で個別にシェアリングを行っているデータにおいては一部のスキーマやテーブルだけ見せたい、ということは十分考えられます。

試してみた:共有されたデータベースの権限細分化

差別化ポイントにも挙げていた、「データベースの共有前にDatabase Rolesを作成しておけば、コンシューマー側がそのDatabase Rolesを使ってスキーマやテーブル単位で細かく権限付与できる」を試してみます。

共有元アカウント:データの確認

共有の作成前に、どんなデータベースを共有するかについて述べておきます。

ここでは、私が検証に使っているSAGARA_RAWDATA_DBを共有することを考えてみます。ただ、下図の通りスキーマが多く存在しているため、この内のCITIBIKEスキーマだけを参照することが出来るDatabase Rolesの作成を考えてみます。

共有元アカウント:Database Rolesの作成

共有元アカウントにて、以下のクエリを実行して、Database Rolesの作成から権限の付与を行います。Database Rolesを作成するときは、create database roleコマンドを使います。詳しくは公式Docをご覧ください。

-- コンテキストの設定
use role sagara_admin_role;
use database sagara_rawdata_db;
use schema citibike;

-- Database Rolesの作成
create database role citibike_select_role;

-- 作成したDatabase Rolesに権限を付与
grant usage on schema citibike to database role citibike_select_role;
grant select on table trips to database role citibike_select_role;

共有元アカウント:データシェアリングの設定

続いて、データシェアリングの設定を行います。

ここではあえて、CITIBIKEスキーマ以外のテーブルも共有するように設定しておきます。

共有を作成する時点で、共有先のアカウントも指定して共有を作成を押します。

共有元アカウント:作成したSHAREオブジェクトへのDatabase Rolesの付与

先程データシェアリングの設定を行って終わり…ではなく、作成したSHAREオブジェクトに対して、作成したDatabase Rolesを付与する必要があります。

具体的には、grant database role ... to share ...のコマンドを用いて、下記のクエリを実行すればOKです。こちらのコマンドについて詳しくは公式Docをご覧ください。

-- コンテキストの設定
use role accountadmin;
use database sagara_rawdata_db;
use schema citibike;

-- 作成したSHAREオブジェクトに対して、Database Rolesを付与
grant database role citibike_select_role to share SAGARA_RAWDATA_DB_SHARE_20230417;

共有先アカウント:動作確認

続いて共有先のアカウントで、共有されたSHAREオブジェクトからデータベースを作成します。

これで、SHATEオブジェクトからデータベースを作成したACCOUNTADMINは、共有されたデータベース上の全てのテーブルを参照することが出来ます。

ただ、ここでやりたいことはSHAREオブジェクトに付与したDatabase Rolesが共有先のアカウントでも使えるのかどうかです。

先程共有元のアカウントで作成したDatabase RolesをPUBLICスキーマに付与してみます。

use role accountadmin;
use database sagara_rawdata_db_share_20230417;
use schema citibike;

-- 念のため、Database Roleがあるか確認
show database roles in database sagara_rawdata_db_share_20230417;

-- PUBLICロールに対して、共有元アカウントで作成したDatabase Rolesを付与
grant database role citibike_select_role to role public;

この上でPUBLICロールに切り替えると、共有元アカウントで作成したDatabase Rolesに付与した権限に沿って、CITIBIKEスキーマのTRIPSテーブルだけが表示されました!

「SNOWFLAKE Database Roles」について

本記事で試したDatabase Rolesがパブリックプレビューになった時に、「SNOWFLAKE Database Roles」という機能もパブリックプレビューとなりました。

これは、Snowflakeアカウント作成時から共有されている「SNOWFLAKE」データベース内の「ACCOUNT_USAGE」スキーマに存在しているviewに対して、閲覧対象のviewを限定して作られたDatabase Rolesです。

具体的には、下記の4種類のDatabase RolesがSNOWFLAKEデータベースにデフォルトで作られており、ユーザーはこれらのDatabase Rolesを別のロールに付与することが出来ます。

  • OBJECT_VIEWERCOLUMNSTABLESなど、オブジェクトメタデータに関するViewが使用可能になるDatabase Roles
  • USAGE_VIEWERMETERING_HISTORYCOPY_HISTORYなど、使用履歴に関するデータを参照できるViewが使用可能になるDatabase Roles
  • GOVERNANCE_VIEWERMASKING_POLICIESQUERY_HISTORYなど、アカウント内のガバナンス周りに必要なデータを参照できるViewが使用可能になるDatabase Roles
  • SECURITY_VIEWERGRABTS_TO_USERSLOGIN_HISTORYなど、アカウント内のセキュリティに関わるデータを参照できるViewが使用可能になるDatabase Roles

各ロールがどのViewを参照できるかは、下記の公式Docも併せてご覧ください。

最後に

「Database Roles」を試してみました。

主なユースケースは、本記事でも試した、共有されたデータベースの一部のデータだけをユーザーに閲覧させるためにDatabase Rolesを使うケースかと思います!デフォルトでSNOWFLAKEデータベースに対するDatabase Rolesも作られるようになったので、まずはこのDatabase Rolesから試すのも良いと思います。