概要
Snowflake での Apache Iceberg™ テーブルにおける Secure Data Sharing(データ共有)機能について検証し、その結果と検証コードを共有します。本記事では、同じ Snowflake リージョン内の 1 つ以上のアカウントへデータを直接共有する機能を対象としています。
出所:Secure Data Sharingについて | Snowflake Documentation
Iceberg テーブルに対して「FUTURE TABLE」で権限を付与しようとするとエラーとなるため、新規で作成したテーブルには、その都度権限を付与する必要があります。共有元アカウント(プロバイダー)で、共有にテーブルを追加する際の手順でこの挙動を確認できます。
003503: SQL compilation error: Future grant on objects of type TABLE to SHARE is restricted.
本記事は「SnowflakeにおけるApache Iceberg機能の完全ガイド」シリーズの一部です。
Apache Iceberg機能の全体像やSnowflake上での活用方法について詳しく知りたい方は、以下の記事をご覧ください。
環境準備
Snowflake Catalog 環境の準備
以下の記事で紹介している環境構築手順を、事前に完了しておいてください。
出所:Snowflake Catalog における Iceberg テーブルの基本的な操作手順 #Spark - Qiita
Snowflake Open Catalog のアカウントを作成
まず、ORGADMIN ロールに切り替えます。
-- ORGADMIN にカレントロールを変更
USE ROLE ORGADMIN;
SELECT CURRENT_ROLE();
Snowflake Open Catalog が有効な Snowflake アカウントを新規で作成します。
-- データ共有先の Snowflake アカウントを作成
-- ToDo EMAIL と REEGION をかえる必要あり
CREATE ACCOUNT manabian_comsumer_01_account
ADMIN_NAME = 'comsumer_admin'
ADMIN_PASSWORD = 'MySecurePassword2025!'
EMAIL = 'admin@example.com'
MUST_CHANGE_PASSWORD = FALSE
EDITION = ENTERPRISE
REGION = 'AZURE_EASTUS2';
次に、Snowflake Open Catalog が有効なアカウントの URL を取得します。
-- カウントの URL を取得
SHOW ACCOUNTS LIKE 'manabian_comsumer_01_account';
上記で作成したアカウントにログインします。
ワークスペースで以下のクエリを実行して、Data Sharing Account Identifier
の値を取得します。必要に応じて、クラスタを作成してください。
SELECT
CURRENT_ORGANIZATION_NAME() || '.' || CURRENT_ACCOUNT_NAME() AS "Data Sharing Account Identifier";
データベースおよびテーブルの作成
データベースを作成
CREATE OR REPLACE DATABASE data_sharing_db;
USE DATABASE data_sharing_db
テーブルの作成
標準テーブルと Iceberg テーブルを作成します。
-- 標準テーブルの作成
CREATE OR REPLACE TABLE nation_standard
AS
SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF10.NATION;
-- Iceberg テーブルの作成
CREATE OR REPLACE ICEBERG TABLE nation_iceberg
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'my_azure_sf_volume'
BASE_LOCATION = 'nation_iceberg'
AS
SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF10.NATION;
SHOW TABLES IN DATABASE data_sharing_db;
直接共有の実施
共有元アカウント(プロバイダー)で共有の作成と権限付与
まず、共有(SHARE)を作成します。
CREATE OR REPLACE SHARE iceberg_share;
次に、共有に対してデータベースとスキーマの USAGE 権限を付与します。
GRANT USAGE ON DATABASE data_sharing_db TO SHARE iceberg_share;
GRANT USAGE ON SCHEMA data_sharing_db.public TO SHARE iceberg_share;
続けて、テーブルに対して SELECT 権限を付与します。標準テーブルと Iceberg テーブルでは権限付与方法が異なる点に注意してください。
-- 標準テーブルの権限を付与
GRANT SELECT ON ALL TABLES IN DATABASE data_sharing_db
TO SHARE iceberg_share;
-- Iceberg テーブルの権限付与
GRANT SELECT ON ALL ICEBERG TABLES IN DATABASE data_sharing_db
TO SHARE iceberg_share;
FUTURE TABLE を用いた権限付与はエラーとなります。
-- 今後作成される標準テーブルの権限を付与
GRANT SELECT ON FUTURE TABLES IN DATABASE data_sharing_db
TO SHARE iceberg_share;
-- Iceberg テーブルの権限付与
GRANT SELECT ON FUTURE ICEBERG TABLES IN DATABASE data_sharing_db
TO SHARE iceberg_share;
003503: SQL compilation error: Future grant on objects of type TABLE to SHARE is restricted.
付与済みの権限を確認します。
SHOW GRANTS TO SHARE iceberg_share;
共有先アカウントを追加します。
-- 共有先アカウントで取得した Data Sharing Account Identifier の値をセット
SET data_sharing_account_identifier = 'MTIRXWM.MANABIAN_COMSUMER_01_ACCOUNT';
ALTER SHARE iceberg_share
ADD ACCOUNTS = $data_sharing_account_identifier;
共有先アカウント(コンシューマー)にて共有を使ったデータベースの作成
まず、共有先アカウントで有効な共有を表示し、iceberg_share
が存在することを確認します。
SHOW SHARES;
下記のクエリで owner_account_and_name
列の値を確認します。
SHOW SHARES;
SELECT
CONCAT($3, '.', $4) AS owner_account_and_name
,$3 AS owner_account
,$4 AS name
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
iceberg_share
の owner_account_and_name
列の値をもとに共有の詳細を確認します。
DESC SHARE MTIRXWM.ZJA50722.ICEBERG_SHARE;
取得した owner_account_and_name
を使用してデータベースを作成します。
CREATE OR REPLACE DATABASE ICEBERG_SHARE_01_DB
FROM SHARE MTIRXWM.ZJA50722.ICEBERG_SHARE;
USE DATABASE ICEBERG_SHARE_01_DB;
作成したデータベースにテーブルが含まれていることを確認します。
SHOW TABLES IN DATABASE ICEBERG_SHARE_01_DB;
テーブルに対してクエリを発行できることを確認します。
SELECT
*
FROM
NATION_STANDARD
LIMIT
3;
SELECT
*
FROM
NATION_ICEBERG
LIMIT
3;
共有元アカウント(プロバイダー)でのテーブル追加
新規テーブル作成後に共有へ権限付与
共有元アカウント(プロバイダー)で新しいテーブルを作成します。
-- Iceberg テーブルの作成
CREATE OR REPLACE ICEBERG TABLE customer_iceberg
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'my_azure_sf_volume'
BASE_LOCATION = 'custmer_iceberg'
AS
SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF10.CUSTOMER;
作成したテーブル customer_iceberg
が、まだ共有に含まれていないことを確認します。
SHOW GRANTS TO SHARE iceberg_share;
全ての Iceberg テーブルを共有に追加し、customer_iceberg
が共有に追加されたことを確認します。
-- Iceberg テーブルの権限付与
GRANT SELECT ON ALL ICEBERG TABLES IN DATABASE data_sharing_db
TO SHARE iceberg_share;
SHOW GRANTS TO SHARE iceberg_share;
共有先アカウント(コンシューマー)でのクエリ実行
最後に、共有先アカウント(コンシューマー)で新たに追加された customer_iceberg
テーブルに対するクエリが可能であることを確認します。
SELECT
*
FROM
CUSTOMER_ICEBERG
LIMIT
3;