Snowflakeで参照権限の無いテーブルのデータをビューで表示する


## 概要
Snowflakeではビューが参照しているテーブルの権限が無くても、そのビューを見ることができるとのことなので、実際に試してみたいと思います。





## 事前準備
DB,スキーマ,ロールを作成し、権限を割り当てていきます。

```SQL
--DBを作成し、切り替える
create database test_DB;
use database test_DB;

--スキーマを2つ作成
create schema test_Schema_01;
create schema test_Schema_02;

--ロールを2つ作成
create role test_Role_01;
create role test_Role_02;

--ユーザーにロールを割り当てる
grant role test_Role_01 to user <ユーザー名>;
grant role test_Role_02 to user <ユーザー名>;

--ロールにウェアハウス、DBの参照権限を割り当てる
grant usage on warehouse COMPUTE_WH to test_Role_01;
grant usage on warehouse COMPUTE_WH to test_Role_02;
grant usage on database TEST_DB to test_Role_01;
grant usage on database TEST_DB to test_Role_02;

--ロール1にはスキーマ1とスキーマ2の参照権限とcreate権限を、ロール2にはスキーマ2の参照権限を割り当てる
grant usage on schema test_Schema_01 to test_Role_01;
grant usage on schema test_Schema_02 to test_Role_01;
grant create table, create view on schema test_Schema_01 to test_Role_01;
grant create table, create view on schema test_Schema_02 to test_Role_01;

grant usage on schema test_Schema_02 to test_Role_02;
```
上記実施後は下記の通りに権限が割り振られます。
ロール1はスキーマ1とスキーマ2へアクセス/テーブル・ビュー作成ができる、ロール2はスキーマ2へのみアクセスができる。

| スキーマ\ロール       |    test_Role_01   |    test_Role_02    |
|:-----------------|:------------------|:-------------------|
| test_Schema_01へのアクセス   |              〇 |        ×        |
| test_Schema_01上でのcreate権限           |            〇 |       ×       |
| test_Schema_02へのアクセス             |              〇 |        〇        |
| test_Schema_02上でのcreate権限               |            〇 |       ×       |




## 確認
それでは表示されるか確認していきます。
まず、ロール1でスキーマ1にテーブルを作成します。
```SQL
//ロール1でスキーマ1にテーブルを作成し、データをinsert 

use role test_Role_01;
use schema test_Schema_01;

create table test_Table( C1 VARCHAR(10) );

insert into test_Table values('test_data');
```


ロール2はスキーマ1へのアクセス権がないので、もちろんこのテーブルを確認することはできません。
```SQL
use role test_Role_02;
select * from "TEST_SCHEMA_01".test_Table
;
```
--出力結果
SQLコンパイルエラー：
Schema 「TEST_DB.TEST_SCHEMA_01」は存在しないか、許可されていません。



次にこのテーブルをそのまま出力するビューをスキーマ2に作成し、ビューのselect権限をロール2に割り当てます。
```SQL
use role test_Role_01;
use schema test_schema_02;

create view test_View
as
select * from "TEST_SCHEMA_01".test_table;

grant select on view test_View to test_Role_02;
```

このビューをロール2でselectします。
```SQL
use role test_Role_02;
select * from test_View;
```

--出力結果
| C1      |  
|:-----------------|
| test_data   |

データを見ることができました。
この時、ロール2は基テーブルの参照権限を保持していません。

```SQL
show grants to role test_Role_02;
```
| ・・・|privilege |	granted_on	| name | ・・・|
|:-----------------|:-----------------|:-----------------|:-----------------|:-----------------|
| ・・・| USAGE| 	DATABASE |	TEST_DB | ・・・ |
| ・・・| USAGE|SCHEMA |	TEST_DB.TEST_SCHEMA_02| ・・・|
| ・・・|SELECT|	VIEW	|TEST_DB.TEST_SCHEMA_02.TEST_VIEW| ・・・|
| ・・・|USAGE|WAREHOUSE	|COMPUTE_WH| ・・・|

## まとめ
基テーブルのselect権限が無くてもビューを通じてデータを確認することができました。
スキーマにビューが追加される度にselect権限を与えるFUTUREによって、より効果的に権限の管理ができそうです。

```SQL
grant select on future views in schema test_Schema_02 to role test_Role_02;
```

ここまでお読みくださりありがとうございました！

 参考
Snowflake公式ドキュメント[アクセス制御の概要]
https://docs.snowflake.com/ja/user-guide/security-access-control-overview

Snowflake公式ドキュメント[オブジェクトに対する将来の付与の割り当て]
https://docs.snowflake.com/ja/user-guide/security-access-control-configure#label-granting-future-privs-on-schema-objects