【Snowflake】Snowflake ~ 入門編 / Hello world ~

■ はじめに

https://dk521123.hatenablog.com/entry/2021/11/02/130111

の続き。

 既に出来合いのシステムの Snowflake を触りだしたのだが、
やっぱり、ちゃんと学びたいと思った。
Snowflakeは、30日間無料トライアルでの使用があるので
基本的な操作をメモしておく。

 また、2021/11/22現在のところ、
セミナーを探していたら、初心者用のセミナーがでてきたので
それらと組み合わせて学習するのもありかも。

目次

【1】Snowflakeアカウント登録
 0)前提条件
 1)手順 - 概要
【2】Snowflakeの操作
 1)Web UIからのGUI操作
 2)Web UIからのSQL実行による操作
【3】Snowflake のログイン / Web UI へのアクセス
【4】サンプル
 例1:Hello world
  a) Database/Schema/Table/Warehouse 作成
  b) SQL によるデータロード (INSERT)
 例2:読み取り専用ロール・ユーザ作成
  a) 読み取り専用ロールのカスタムロール作成
  b) ロール階層の上位レベルロールを割り当てる
  c) 各オブジェクトに権限付与
  d) 読み取り専用ユーザ作成
  e) 動作確認

【1】Snowflakeアカウント登録方法

0)前提条件

* 登録用のEmail

1)手順 - 概要

以下のSnowflakeのトライアルページにアクセスする

Snowflake Trial

各項目を入力して、Emailが届くので、Activationすれば
後は、流れで使えるようになる

 => 詳細は、以下のサイト参照。

https://knowledge.insight-lab.co.jp/snowflake/beginner/free-trial
https://dev.classmethod.jp/articles/snowflake-trial/

【2】Snowflakeの操作

大きく分けて、以下の2通りがある。
~~~~~~~~~~~~
1)Web UIからのGUI操作
2)Web UIからのCLI実行による操作
~~~~~~~~~~~~

1)Web UIからのGUI操作

* Web UI を通して、操作する

例:データベース作成

[1] Web UI から [データベース]-[作成(+)]を選択
[2] データベース名(ex. hello_world)を入力し、「完了」ボタン押下

2)Web UIからのSQL実行による操作

* Web UI の ワークシート上で、SQLを実行して操作する

例:データベース作成

[1] Web UI から [ワークシート]を選択
[2] 以下のSQLを入力し、「実行」ボタン押下
~~~~~~~~~~~
create database hello_world2;
~~~~~~~~~~~

【3】Snowflake のログイン / Web UI へのアクセス

* メール(件名:「Welcome To Snowflake!」)の中に
 「LOGIN TO IN SNOWFLAKE」ボタンを押下すると、
 ログイン画面に遷移できる

 => 適切なログイン情報でログインできると
  Snowflake の Web UI にアクセスできる

【4】サンプル

例1:Hello world

a) Database/Schema/Table/Warehouse 作成

-- Database作成
CREATE DATABASE demo_database;
-- DROP DATABASE demo_database;

-- Schema作成
CREATE SCHEMA demo_database.demo_schema;
-- DROP SCHEMA  demo_database.demo_hello_schema;

-- Table作成
CREATE TABLE demo_database.demo_schema.demo_hello (
  id STRING
  , name STRING
);
-- DROP TABLE demo_database.demo_schema.demo_hello;

-- Warehouse作成
CREATE WAREHOUSE demo_warehouse WITH
  WAREHOUSE_SIZE = xsmall
  INITIALLY_SUSPENDED = TRUE
  AUTO_SUSPEND = 60
  AUTO_RESUME = TRUE;
-- DROP WAREHOUSE demo_warehouse;

USE WAREHOUSE demo_warehouse;

b) SQL によるデータロード (INSERT)

USE DATABASE demo_database;
USE SCHEMA demo_schema;

-- INSERT
INSERT INTO demo_hello (id, name)
VALUES('x0001', 'Hello'), ('x0002', 'World');

-- SELECT
SELECT * FROM demo_hello;

例2:読み取り専用ロール・ユーザ作成

* 以下を参考に、読み取り専用ロール・ユーザを作成してみる
 => SECURITYADMIN ロール以上のユーザーとして実行

https://docs.snowflake.com/ja/user-guide/security-access-control-configure.html#creating-read-only-roles
a) 読み取り専用ロールのカスタムロール作成

CREATE ROLE read_only_role
  COMMENT = 'This role is for read only';

b) ロール階層の上位レベルロールを割り当てる

GRANT ROLE read_only_role
  TO ROLE sysadmin;

c) 各オブジェクトに権限付与

-- DB使用の権限
GRANT USAGE
  ON DATABASE demo_database
  TO ROLE read_only_role;

-- Schema使用の権限
GRANT USAGE
  ON SCHEMA demo_database.demo_schema
  TO ROLE read_only_role;

-- SELECT実行権限
GRANT SELECT
  ON ALL TABLES IN SCHEMA demo_database.demo_schema
  TO ROLE read_only_role;
-- ★注意★
-- 既存テーブルにのみ適用。
-- 新しいテーブル作成した際は適用されない

-- 将来的にも、読専にしたい場合
GRANT USAGE
  ON FUTURE SCHEMAS IN DATABASE demo_database
  TO ROLE read_only_role;

GRANT SELECT
  ON FUTURE TABLES IN SCHEMA demo_database.demo_schema
  TO ROLE read_only_role;

-- ウェアハウス使用の権限
GRANT USAGE
  ON WAREHOUSE demo_warehouse
  TO ROLE read_only_role;

d) 読み取り専用ユーザ作成

CREATE USER IF NOT EXISTS demo_read_only_user
  LOGIN_NAME = "demo_read_only_user"
  DEFAULT_ROLE = "read_only_role"
  PASSWORD = "password" -- ★ここは、パスワード変える★
  MUST_CHANGE_PASSWORD = TRUE
;

補足:既存ユーザに対して割り当てる場合

-- 1) 一旦、無効化
ALTER USER demo_read_only_user SET DISABLED=true;

-- 2) 対象ユーザに、読み取り専用ロールを適用する
GRANT ROLE read_only_role TO USER demo_read_only_user;

-- 3) デフォルトロールに、読み取り専用ロールを適用する
ALTER USER demo_read_only_user SET DEFAULT_ROLE = read_only_role;

-- 4) 有効化
ALTER USER demo_read_only_user SET DISABLED=false;

e) 動作確認

-- ログアウトして、「demo_read_only_user」でログインしなおす

USE DATABASE demo_database;
USE SCHEMA demo_schema;

-- OK
SELECT * FROM demo_hello;

-- ここで、エラー「SQL access control error: Insufficient privileges to operate on table 'DEMO_HELLO'」
INSERT INTO demo_hello (id, name)
VALUES('x0003', 'Hello'), ('x0004', 'World');

関連記事

Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 基本編 / データ型 ~
https://dk521123.hatenablog.com/entry/2021/12/16/095524
Snowflake ~ 基本編 / キャスト ~
https://dk521123.hatenablog.com/entry/2021/12/15/162658
Snowflake ~ 日時関連 ~
https://dk521123.hatenablog.com/entry/2022/06/17/113003
Snowflake ~ 日時関連 / 日時取得関数 ~
https://dk521123.hatenablog.com/entry/2022/09/02/092144
Snowflake ~ 文字列操作関連 ~
https://dk521123.hatenablog.com/entry/2022/10/01/000000
Snowflake ~ 基本編 / テーブル ~
https://dk521123.hatenablog.com/entry/2022/09/03/012113
Snowflake ~ 基本編 / アクセス制御 ~
https://dk521123.hatenablog.com/entry/2021/11/16/231010
Snowflake ~ 基本編 / ゼロコピークローン ~
https://dk521123.hatenablog.com/entry/2021/11/27/134934
Snowflake ~ 基本編 / ステージ ~
https://dk521123.hatenablog.com/entry/2022/09/01/220643
Snowflake ~ 基本編 / データロード ~
https://dk521123.hatenablog.com/entry/2021/11/15/221245
Snowflake ~ 基本編 / View ~
https://dk521123.hatenablog.com/entry/2022/10/10/000000
Snowflake ~ Materialized View ~
https://dk521123.hatenablog.com/entry/2023/06/22/100804
Snowflake ~ Snowpipe ~
https://dk521123.hatenablog.com/entry/2023/04/15/225515
Snowflake ~ Snowpipe Streaming ~
https://dk521123.hatenablog.com/entry/2023/07/04/001637
Snowflake ~ ウェアハウス / Warehouse ~
https://dk521123.hatenablog.com/entry/2022/12/04/000000
Snowflake ~ リソースモニター ~
https://dk521123.hatenablog.com/entry/2022/12/01/000000
Snowflake ~ ウェアハウス負荷監視 ~
https://dk521123.hatenablog.com/entry/2022/12/06/191727
Snowflake ~ データ アンロード ~
https://dk521123.hatenablog.com/entry/2022/07/04/172738
Snowflakeアンロード の 使用上の注意
https://dk521123.hatenablog.com/entry/2022/07/06/145724
Snowflake ~ ユーザ/ロールあれこれ ~
https://dk521123.hatenablog.com/entry/2022/11/02/144541
Snowflake ~ Removeコマンド ~
https://dk521123.hatenablog.com/entry/2022/09/26/150259
Snowflake ~ ストレージ統合 ~
https://dk521123.hatenablog.com/entry/2022/06/29/221037
Snowflake ~ ストレージ統合の作成手順 ~
https://dk521123.hatenablog.com/entry/2023/07/27/000000
Snowflake ~ Task ~
https://dk521123.hatenablog.com/entry/2023/04/17/174732
Snowflake ~ GRANT OWNERSHIP ~
https://dk521123.hatenablog.com/entry/2022/02/25/094250
Snowflake ~ SHOW / DESCRIBE ~
https://dk521123.hatenablog.com/entry/2022/02/24/231532
Snowflake ~ SHOW GRANT ~
https://dk521123.hatenablog.com/entry/2022/10/25/213624
Snowflake ~ File Format ~
https://dk521123.hatenablog.com/entry/2022/07/28/153332
Snowflake ~ MERGE INTO ~
https://dk521123.hatenablog.com/entry/2022/08/01/132611
Snowflake ~ MERGE の使用上の注意 ~
https://dk521123.hatenablog.com/entry/2023/09/05/161817
Snowflake ~ GET_DDL
https://dk521123.hatenablog.com/entry/2022/08/12/221106
Snowflake ~ SEQUENCE ~
https://dk521123.hatenablog.com/entry/2023/07/14/091918
Snowflake ~ Dynamic masking ~
https://dk521123.hatenablog.com/entry/2022/10/07/102337
Snowflake ~ Replication ~
https://dk521123.hatenablog.com/entry/2022/10/06/110305
Snowflakeトランザクション
https://dk521123.hatenablog.com/entry/2022/12/19/221551
Snowflake ~ ネットワークポリシー ~
https://dk521123.hatenablog.com/entry/2022/12/08/120131
Snowflake ~ TAG ~
https://dk521123.hatenablog.com/entry/2023/08/08/172648
Snowflake ~ クエリの中断 ~
https://dk521123.hatenablog.com/entry/2022/12/09/152837
Snowflake ~ テストデータ作成 / generator ~
https://dk521123.hatenablog.com/entry/2022/06/20/095659
Snowflake ~ Data Sharing ~
https://dk521123.hatenablog.com/entry/2024/02/19/152927
Snowflake ~ IDENTIFIER / SET ~
https://dk521123.hatenablog.com/entry/2024/02/20/095207
Snowflake ~ Partition構成のデータを取り込む ~
https://dk521123.hatenablog.com/entry/2022/10/28/000925
Snowflake ~ テーブルの簡易バックアップを考える ~
https://dk521123.hatenablog.com/entry/2022/11/07/224328
Snowflakeのパフォーマンス改善 ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/09/20/002235
Snowflakeのパフォーマンス改善 ~ データロードの改善 ~
https://dk521123.hatenablog.com/entry/2022/12/07/111847
Snowflakeのパフォーマンス改善 ~ 検索最適化サービス ~
https://dk521123.hatenablog.com/entry/2023/02/27/120943
Snowflakeのパフォーマンス改善 ~ クラスタリングキー ~
https://dk521123.hatenablog.com/entry/2023/03/04/222610
Snowflakeのパフォーマンス改善 ~ クエリプロファイル / 実行計画 ~
https://dk521123.hatenablog.com/entry/2023/09/12/194705
Snowflake ~ 統計情報 ~
https://dk521123.hatenablog.com/entry/2023/08/03/000817
SparkからSnowflakeへの接続について考える
https://dk521123.hatenablog.com/entry/2023/03/19/013833
Snowflake ~ キーペア認証 ~
https://dk521123.hatenablog.com/entry/2023/06/08/004532
権限トラブル時のTips
https://dk521123.hatenablog.com/entry/2022/08/19/131922
Snowflake ~ エラー時の解析方法 ~
https://dk521123.hatenablog.com/entry/2022/04/20/192334
Snowflake ~ 見積もり・コスト ~
https://dk521123.hatenablog.com/entry/2023/06/13/000000
Snowflake】ストアド ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/12/11/202904
Snowflake】ストアド ~ 基本編 / 条件分岐 ~
https://dk521123.hatenablog.com/entry/2022/12/26/211349
Snowflake】ストアド ~ 基本編 / ループ ~
https://dk521123.hatenablog.com/entry/2022/12/16/143349
Snowflake】ストアド ~ EXECUTE IMMEDIATE ~
https://dk521123.hatenablog.com/entry/2022/12/17/000217
Snowflake】ストアド ~ クエリ結果を受け取る ~
https://dk521123.hatenablog.com/entry/2022/12/24/212242
Snowflake】ストアド ~ 例外 / EXCEPTION ~
https://dk521123.hatenablog.com/entry/2022/12/23/223345
Snowflake】ストアド ~ デバッグログについて ~
https://dk521123.hatenablog.com/entry/2022/12/18/121334
Snowflake】ストアド ~ S3内にパーティション構成でUnloadする ~
https://dk521123.hatenablog.com/entry/2022/12/27/225629
Snowflake】ストアド ~ ステージ内でデータ0件の場合エラーにする ~
https://dk521123.hatenablog.com/entry/2022/12/29/175848
SnowflakePythonでクエリ実行 ~
https://dk521123.hatenablog.com/entry/2023/10/27/235743
エラー「Failed to cast variant value "" to XXX」時の対応
https://dk521123.hatenablog.com/entry/2021/12/17/102659
エラー「Insufficient privileges to operate」時の対応
https://dk521123.hatenablog.com/entry/2022/08/02/090439
エラー「Table does not exist or not authorized」時の対応
https://dk521123.hatenablog.com/entry/2022/08/18/120935
エラー「Error assuming AWS_ROLE」時の対応
https://dk521123.hatenablog.com/entry/2022/11/25/175912
所有権変更後にエラー「current role has no privileges on it」
https://dk521123.hatenablog.com/entry/2023/04/14/151140
エラー「Ownership restriction violation」時の対応
https://dk521123.hatenablog.com/entry/2023/07/13/000000
COPY INTO したがデータが格納されていない
https://dk521123.hatenablog.com/entry/2022/12/20/152040
指定した日付分アンロードするSQLを生成するPythonコード
https://dk521123.hatenablog.com/entry/2023/08/09/000000
Kafkaコネクタ ~ Kafka用Snowflakeコネクタ ~
https://dk521123.hatenablog.com/entry/2023/06/07/144114