SnowflakeにおけるData Sharing(データ共有)

## はじめに
**Secure Direct Data Share**(データ共有)を使うことで、異なるSnowflakeアカウント間でデータ共有が可能になります。

ナレッジ共有のため構築手順を記事にまとめておきたいと思いました。

## アーキテクチャ
以下2つのアカウント間でテーブルのデータを共有します。
共有する側のアカウント：VB7XXXX
共有される側のアカウント：MURAMATSU_XXXX

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/24e146fe-3d08-bc16-004b-5926486d00e9.png)

共有する側のアカウントで「データ共有」を作成し、テーブルに対するSELECT権限を付与します。
共有される側のアカウントで、「データ共有」から読取専用データベースを作成することで、共有されたテーブルにSELECTすることが可能になります。

## データ共有の構築手順
共有する側のアカウントと共有される側のアカウントそれぞれで必要な作業があります。
**<共有する側のアカウント>**
1.データ共有の作成
2.データ共有に対して権限を付与
3.データ共有にSnowflakeアカウントを追加

**<共有される側のアカウント>**
1.データ共有から読取専用データベースの作成
2.読取専用データベースに対するImported Privileges権限の付与

## 共有する側のアカウントの作業
作業は、<font color="red">ACCOUNTADMIN</font>ロールで行います。
### 1.データ共有の作成
以下のSQLを実行して「データ共有」を作成します。
```
create share データ共有の名称;
```

### 2.データ共有に対して権限を付与
テーブルを他のアカウントに共有させるには、データ共有に対して以下の権限を付与する必要があります。
・テーブルを保存するデータベースに対するUSAGE権限
・テーブルを保存するスキーマに対するUSAGE権限
・テーブルに対するSELECT権限

以下のSQLを実行して権限を付与します。
```
grant usage on database データベース名 to share データ共有の名称;
grant usage on schema スキーマ名 to share データ共有の名称;
grant select on テーブル名 to share データ共有の名称;
```

以下は、sharing_db.weather.weater_14_totakテーブルに対するSelect権限をデータ共有に付与する例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/f749d01a-4159-9e5d-6f75-25ff42199160.png)

<font color="red">※ スキーマ内の全てのテーブルに対して一括でSELECT権限を付与するには</font>
以下のように<font color="red">select on all tables in schema</font>で、スキーマ内の全てのテーブルに対してSELECT権限を付与できます。
```
grant select on all tables in schema スキーマ名 to share データ共有の名称;
```

### 3.データ共有にSnowflakeアカウントを追加
以下のSQLを実行してSnowflakeアカウントを追加します。
```
alter share データ共有の名称 add accounts=組織名.アカウント名;
```

<font color="red">※ 共有する側のアカウントのSnowflakeエディションがBusiness Criticalで、共有される側のエディションがEnterprise以下の場合、エラー</font>となります。
Business CriticalからEnterpriseエディションへのデータ共有を可能にするには、
<font color="red">SHARE_RESTRICTIONS</font>オプションで**FALSE**を指定する必要があります。
```
alter share データ共有の名称 add accounts=組織名.アカウント名 SHARE_RESTRICTIONS = FALSE;
```

## 共有される側のアカウントの作業
作業は、<font color="red">ACCOUNTADMIN</font>ロールで行います。
### 1.データ共有から読取専用データベースの作成
以下のSQLを実行して「データ共有」から読取専用データベースを作成します。
```
create database 読取専用データベースの名称 from データ共有の名称;
```

### 2.読取専用データベースに対するImported Privileges権限の付与
読取専用データベースを作成した時点では、ACCOUNTADMINロールを持つユーザーしか共有されたテーブルを参照できません。
他のロールが共有されたテーブルを参照するには、<font color="red">imported privileges</font>を付与する必要があります。
```
grant imported privileges on database 読取専用データベースの名称 to role ロールの名称;
```

以下は、CUSTOM_ROLEという名称のロールにimported privilegesを付与して、共有されたテーブルを参照できるようにした例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/31655f1a-e5d7-f269-2493-9c16fee841ed.png)

## データ共有できること/できないこと
共有されたテーブルに対して以下のような制約があります。
**<できること>**
・共有されたテーブルを基にVIEWを作成
・共有されたテーブルに対してStreamを作成

**<できないこと>**
・共有されたテーブルに対してCloneの作成
・共有されたテーブルをさらに他のアカウントへ共有

## おわりに
Secure Direct Data Share(データ共有)を業務で使った経験をもとに今回の記事を書かせていただきました。Data MarketplaceやData Exchange等の他のData Sharingについてはまだ実務経験がないので、今後の業務で経験を共有していきたいと思います。

# ご案内
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area