2015/4/16 に BigQuery で row-level permission が導入されたと発表がありましたが、使い方が一向にドキュメントとしてでてこなくて、モヤモヤしていましたが、中の人である Jordan さんが、Stack Overflow で使い方を解説している記事をみつけたので、試してみました。
ちなみに row-level permission と言いますが、View を使っているため、行と合わせて列単位でも制限を書けることができます。
元記事
- How do I use row-level permissions in BigQuery?
- How do I give different users access to different rows without creating separate views in BigQuery?
元記事が2つあるので、Qiita でも2つに分けます。この記事では1番目の記事について解説します。2つ目はまた後日。
単純に公開する行を制限したい場合
- 元データを含む private データセット、テーブルを作る。その際に、フィルタリング用の列を作っておく
- 1 で作ったテーブルを参照する View を public なデータセットに作成する
- private データセットを 2 で作成した View 経由でアクセスできるようにする
- public データセットを公開したいユーザ/グループに共有する
1. 元データを含む private データセット、テーブルを作る。その際に、フィルタリング用の列を作っておく
こんな感じのテーブルを作ります。is_secret
が行の権限フィルタリング用の項目です。(この作業中に、WebUI のスキーマ指定のUIが進化していることに気が付きました。)
データはこんな感じで入れておきます。
customer:string | id:integer | hidden_value:string | is_secret:boolean |
---|---|---|---|
c001 | 1 | A | false |
c002 | 2 | B | true |
c003 | 3 | C | false |
これが private データセットの customer テーブルとして保存されているとします。
2. 1で作ったテーブルを参照するビューを public なデータセットに作成する
上記のテーブルに対して、公開対象とする列、行を含むように View を作ります。
SELECT
customer,
id
FROM
[private.customer]
WHERE
is_secret = false
これを public データセットの public_customer ビューとして保存します。
3. private データセットを 2 で作成した View 経由でアクセスできるようにする
このまま public データセットを共有しても、View は見えるのですが、権限エラーで SELECT できません。これを解消するために、private データセットを 2 で作成した View 経由でアクセスできるようにする設定をします。
まず、private データセットを選択し、"Share dataset" を選択
次に "Add people" 欄で、種別として、"Authorized View" を選び、テキストボックス欄に View 名を project_id:dataset_id.table_id
形式で入れます。
以下のように設定されていればOKです。
4. public データセットを公開したいユーザ/グループに共有する
あとは public データセットを公開したいユーザ/グループに共有するだけで完了です。アカウントを切り替えて、SELECT できることを確認しましょう。
以上です。