☃️
SnowPro Core資格への道 ~Part3:クローン
SnowPro Coreの勉強をSatomi Kさんのお誘いで改めてはじめました。
すでに、横澤さんに教えてもらった勉強会の後、挫折しておりました。
ここに書きます。9月のSnowflake World Tour TokyoまでにSnowPro Coreをとります!
試験日を8月28日(木)に受けようと思います。まだ申し込んでいませんが、そろそろちゃんと頑張る。
今日のお題はクローンです。
クローン
クローン、良く業務でも使います。
ただ、試験模擬問題でがっつり間違えてしまいました。
何がクローン出来て、何がクローン出来ないのか。
ドキュメントを見てみたいと思います。
出典:https://docs.snowflake.com/ja/sql-reference/sql/create-clone
クローンNGはこちらだそうです。
- 外部テーブル (EXTERNAL TABLE)
- タスク (TASK)
- ファンクション (FUNCTION) / UDF
- パイプ (PIPE)のうち、内部ステージを参照するパイプ
- 例:CREATE OR REPLACE PIPE MY_CLONE_PIPE CLONE MY_SOURCE_PIPE;
- 内部ステージ
- 例:CREATE OR REPLACE STAGE MY_CLONE_INTERNAL_NAMED_STAGE CLONE MY_INTERNAL_NAMED_STAGE;
難しいなと感じたのがステージのクローンの挙動です。
試してみた
ここは時間をかけずに試したいのでAIさんにクローン元のテーブルを作ってもらいます。
事前準備
-- データベースとスキーマの作成 (もし存在しない場合)
CREATE DATABASE IF NOT EXISTS MY_TEST_DB;
USE DATABASE MY_TEST_DB;
CREATE SCHEMA IF NOT EXISTS MY_TEST_SCHEMA;
USE SCHEMA MY_TEST_SCHEMA;
-- クローン元となるテーブルの作成とデータ挿入
CREATE OR REPLACE TABLE MY_SOURCE_TABLE (
ID INT,
NAME VARCHAR(50),
CREATED_AT TIMESTAMP_NTZ DEFAULT CURRENT_TIMESTAMP()
);
INSERT INTO MY_SOURCE_TABLE (ID, NAME) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie');
-- クローン元となるストリームの作成
CREATE OR REPLACE STREAM MY_SOURCE_STREAM ON TABLE MY_SOURCE_TABLE;
-- クローン元となるシーケンスの作成
CREATE OR REPLACE SEQUENCE MY_SOURCE_SEQUENCE START WITH 1 INCREMENT BY 1;
-- クローン元となるファイルフォーマットの作成 (CSV形式を想定)
CREATE OR REPLACE FILE FORMAT MY_SOURCE_FILE_FORMAT
TYPE = 'CSV'
FIELD_DELIMITER = ','
SKIP_HEADER = 1 -- ヘッダー行をスキップ
;
-- Frosty Friday Week 1 風 外部テーブルの作成
-- Trial環境ではS3への実際のアクセスはできませんが、構文は有効です。
-- これにより、外部テーブルのCLONEがサポートされないことを示します。
CREATE OR REPLACE EXTERNAL TABLE FROSTY_FRIDAY_WEEK_1_EXTERNAL_TABLE (
CHALLENGE_NAME VARCHAR(100) AS (VALUE:c1::VARCHAR),
CHALLENGE_DATE DATE AS (VALUE:c2::DATE)
)
LOCATION = 's3://frostyfridaychallenges/challenge_1/' -- Frosty Friday Week 1のS3パス
FILE_FORMAT = MY_SOURCE_FILE_FORMAT
AUTO_REFRESH = FALSE -- Trial環境ではS3イベント通知の設定が難しいためFALSE
;
-- ダミーのユーザー定義関数 (UDF) の作成 (クローンNGの例で使用)
CREATE OR REPLACE FUNCTION MY_SOURCE_FUNCTION(a INT, b INT)
RETURNS INT
LANGUAGE SQL
AS
$$
a + b
$$;
---
-- **クローンNGの例のためのパイプの作成**
-- パイプはテーブルとステージを必要とします。ダミーのステージとテーブルを作成します。
CREATE OR REPLACE TABLE MY_PIPE_TARGET_TABLE (
COL1 VARCHAR,
COL2 VARCHAR
);
-- 内部ステージを作成します。
CREATE OR REPLACE STAGE MY_PIPE_STAGE;
-- パイプを作成します。これはファイルがステージに置かれたときにテーブルにロードする設定です。
-- Trial環境では実際にファイルを置くことは難しいですが、パイプ自体は作成できます。
CREATE OR REPLACE PIPE MY_SOURCE_PIPE
AUTO_INGEST = FALSE -- Trial環境では自動インジェストを設定しにくいのでFALSE
AS
COPY INTO MY_PIPE_TARGET_TABLE (COL1, COL2)
FROM @MY_PIPE_STAGE
FILE_FORMAT = (TYPE = 'CSV');
SELECT '--- 事前準備が完了しました。---' AS Status;
あれ、下記の部分エラーになっちゃうけど進めてみよう
CREATE OR REPLACE EXTERNAL TABLE FROSTY_FRIDAY_WEEK_1_EXTERNAL_TABLE (
CHALLENGE_NAME VARCHAR(100) AS (VALUE:c1::VARCHAR),
CHALLENGE_DATE DATE AS (VALUE:c2::DATE)
)
LOCATION = 's3://frostyfridaychallenges/challenge_1/' -- Frosty Friday Week 1のS3パス
FILE_FORMAT = MY_SOURCE_FILE_FORMAT
AUTO_REFRESH = FALSE -- Trial環境ではS3イベント通知の設定が難しいためFALSE
;
クローンOKのSQL
---
-- 1.1. データベースのクローン
-- MY_TEST_DB のメタデータとデータを MY_CLONE_DB に複製します。
-- (既存の MY_CLONE_DB があれば上書きされます)
USE DATABASE MY_TEST_DB;
CREATE OR REPLACE DATABASE MY_CLONE_DB CLONE MY_TEST_DB;
SELECT 'データベース MY_CLONE_DB がクローンされました。' AS Status;
---
-- 1.2. スキーマのクローン
-- MY_TEST_DB 内の MY_TEST_SCHEMA を MY_CLONE_SCHEMA に複製します。
-- (既存の MY_CLONE_SCHEMA があれば上書きされます)
USE DATABASE MY_TEST_DB; -- 対象のデータベースを指定
CREATE OR REPLACE SCHEMA MY_TEST_DB.MY_CLONE_SCHEMA CLONE MY_TEST_DB.MY_TEST_SCHEMA;
SELECT 'スキーマ MY_TEST_DB.MY_CLONE_SCHEMA がクローンされました。' AS Status;
---
-- 1.3. テーブルのクローン
-- MY_TEST_DB.MY_TEST_SCHEMA 内の MY_SOURCE_TABLE を MY_CLONE_TABLE に複製します。
-- (既存の MY_CLONE_TABLE があれば上書きされます)
USE DATABASE MY_TEST_DB; -- 対象のデータベースを指定
USE SCHEMA MY_TEST_SCHEMA; -- 対象のスキーマを指定
CREATE OR REPLACE TABLE MY_CLONE_TABLE CLONE MY_SOURCE_TABLE;
SELECT 'テーブル MY_CLONE_TABLE がクローンされました。' AS Status;
SELECT * FROM MY_CLONE_TABLE; -- クローンされたテーブルの内容を確認
---
-- 1.4. ストリームのクローン
-- MY_TEST_DB.MY_TEST_SCHEMA 内の MY_SOURCE_STREAM の定義を MY_CLONE_STREAM に複製します。
-- (既存の MY_CLONE_STREAM があれば上書きされます)
-- 注意: クローンされたストリームは初期状態では空であり、ソースのオフセットは引き継がれません。
USE DATABASE MY_TEST_DB; -- 対象のデータベースを指定
USE SCHEMA MY_TEST_SCHEMA; -- 対象のスキーマを指定
CREATE OR REPLACE STREAM MY_CLONE_STREAM ON TABLE MY_SOURCE_TABLE CLONE MY_SOURCE_STREAM;
SELECT 'ストリーム MY_CLONE_STREAM がクローンされました。 (注意: クローンされたストリームは空です)' AS Status;
SELECT SYSTEM$STREAM_HAS_DATA('MY_CLONE_STREAM'); -- クローンされたストリームは通常Falseを返します
---
-- 1.5. シーケンスのクローン
-- MY_TEST_DB.MY_TEST_SCHEMA 内の MY_SOURCE_SEQUENCE の定義を MY_CLONE_SEQUENCE に複製します。
-- (既存の MY_CLONE_SEQUENCE があれば上書きされます)
USE DATABASE MY_TEST_DB; -- 対象のデータベースを指定
USE SCHEMA MY_TEST_SCHEMA; -- 対象のスキーマを指定
CREATE OR REPLACE SEQUENCE MY_CLONE_SEQUENCE CLONE MY_SOURCE_SEQUENCE;
SELECT 'シーケンス MY_CLONE_SEQUENCE がクローンされました。' AS Status;
SELECT MY_CLONE_SEQUENCE.NEXTVAL; -- クローンされたシーケンスの次の値を取得
---
-- 1.6. ファイルフォーマットのクローン
-- MY_TEST_DB.MY_TEST_SCHEMA 内の MY_SOURCE_FILE_FORMAT の定義を MY_CLONE_FILE_FORMAT に複製します。
-- (既存の MY_CLONE_FILE_FORMAT があれば上書きされます)
USE DATABASE MY_TEST_DB; -- 対象のデータベースを指定
USE SCHEMA MY_TEST_SCHEMA; -- 対象のスキーマを指定
CREATE OR REPLACE FILE FORMAT MY_CLONE_FILE_FORMAT CLONE MY_SOURCE_FILE_FORMAT;
SELECT 'ファイルフォーマット MY_CLONE_FILE_FORMAT がクローンされました。' AS Status;
このロジックだとSTREAMのクローンでエラーが出ちゃうけど、今回勉強のためなのでスルー。
本来は原因追及までしなくちゃだけど、今日は速報性とアウトプットを大事にしたいので、そのまま進む。
クローンNGのSQL
---
-- 各操作の前に、使用するデータベースとスキーマを明示的に指定します。
USE DATABASE MY_TEST_DB;
USE SCHEMA MY_TEST_SCHEMA;
---
-- 2.1. 外部テーブルのクローン (NG)
-- 外部テーブルは、それが参照するストレージの種類(S3や内部ステージなど)に関わらず、
-- CLONE構文では直接サポートされていません。
-- このSQLはエラーになるため、コメントアウトしてあります。実行するとエラーメッセージが表示されます。
-- CREATE OR REPLACE EXTERNAL TABLE FROSTY_FRIDAY_WEEK_1_EXTERNAL_TABLE_CLONE CLONE FROSTY_FRIDAY_WEEK_1_EXTERNAL_TABLE;
SELECT '外部テーブル FROSTY_FRIDAY_WEEK_1_EXTERNAL_TABLE のクローンはサポートされていません (エラーになります)。' AS Status;
-- 代替案: 外部テーブルは、GET_DDL関数で定義を取得し、新しい名前で再作成する必要があります。
-- SELECT GET_DDL('EXTERNAL TABLE', 'FROSTY_FRIDAY_WEEK_1_EXTERNAL_TABLE');
そもそも事前準備のところでエラーが出ていたのでクローンNGのエラーじゃないけど、EXTERNAL TABLEが外部テーブルなんだなというのは覚えておく。
---
-- 2.2. タスクのクローン (NG)
-- タスクは直接クローンできません。
CREATE OR REPLACE TASK MY_CLONE_TASK CLONE MY_SOURCE_TASK;
SELECT 'タスクのクローンはサポートされていません (エラーになります)。' AS Status;
-- 代替案: GET_DDL('TASK', '...') で定義を取得し、新しい名前で再作成します。
---
-- 2.3. パイプのクローン (NG)
-- パイプは直接クローンできません。
CREATE OR REPLACE PIPE MY_CLONE_PIPE CLONE MY_SOURCE_PIPE;
SELECT 'パイプのクローンはサポートされていません (エラーになります)。' AS Status;
-- 代替案: GET_DDL('PIPE', '...') で定義を取得し、新しい名前で再作成します。
---
-- 2.4. ファンクション (UDF) のクローン (NG)
-- ユーザー定義関数 (UDF) も直接クローンできません。
CREATE OR REPLACE FUNCTION MY_CLONE_FUNCTION(a INT, b INT) CLONE MY_SOURCE_FUNCTION(INT, INT);
SELECT 'ユーザー定義関数 (UDF) のクローンはサポートされていません (エラーになります)。' AS Status;
-- 代替案: GET_DDL('FUNCTION', '...') で定義を取得し、新しい名前で再作成します。
まとめ
SnowPro Coreに向けた学び方としては、NGの方を覚えておいた方が良さそうなので、この5つを覚えておこう!
- 外部テーブル (EXTERNAL TABLE)
- タスク (TASK)
- ファンクション (FUNCTION) / UDF
- パイプ (PIPE)のうち、内部ステージを参照するパイプ
- 例:CREATE OR REPLACE PIPE MY_CLONE_PIPE CLONE MY_SOURCE_PIPE;
- 内部ステージ
- 例:CREATE OR REPLACE STAGE MY_CLONE_INTERNAL_NAMED_STAGE CLONE MY_INTERNAL_NAMED_STAGE;
Discussion