SnowflakeのSecure Viewを試してみた #SnowflakeDB

2021.12.04

※本エントリは、Snowflakeをより使いこなそう! Advent Calendar 2021の4日目の記事となります。

さがらです。

SnowflakeのSecure Viewを試してみたので、その内容をまとめてみます。

Secure Viewとは?

通常のviewはSELECT文が書かれたSQLと共に定義されるため、DDL文を取得する関数などを用いることでそのSQLの定義文がわかるようになっています。

しかしSecure Viewを用いることで、その名の通り「Secure」になるため、viewに定義されたSELECT文を相手に公開せずviewが返す結果だけを提供する事が出来ます。

以下の公式Docも併せて御覧ください。(日本語だと「安全なビュー」と表記されています。)

試してみた

以下2つのviewを用意してみます。

  • view「aaa」:普通のviewとして定義
  • view「bbb」:Secure Viewとして定義

この上で、前準備として以下のクエリを実行します。

-- データベースとテーブルの定義
USE ROLE sysadmin;
CREATE DATABASE secure_view_test;
CREATE TABLE sample_table (no int);

-- view「aaa」は普通のviewとして定義
CREATE VIEW aaa AS
SELECT * FROM sample_table LIMIT 10;

-- view「bbb」はSecure Viewとして定義
CREATE SECURE view bbb AS
SELECT * FROM sample_table LIMIT 10;

-- 閲覧制限をかけたいロール「custom_role」を作る
USE ROLE accountadmin;
CREATE ROLE custom_role;

-- データベース、スキーマ、viewに対する権限を付与。viewにだけ権限与えるのがポイント
GRANT USAGE
    ON DATABASE secure_view_test
    TO ROLE custom_role;
GRANT USAGE
    ON SCHEMA secure_view_test.public
    TO ROLE custom_role;
GRANT SELECT
    ON ALL VIEWS IN SCHEMA secure_view_test.public
    TO ROLE custom_role;

-- ウェアハウスの使用権限を付与する
GRANT USAGE
    ON WAREHOUSE compute_wh
    TO ROLE custom_role;

-- ユーザーへのcustom_roleの付与
GRANT ROLE custom_role
    TO USER satoshisagara;

この上で、GET_DDLという対象のオブジェクトのDDL文を確認できる関数を使ってみます。

まず通常のviewの場合は、このようにDDL文が見えてしまいます。

USE ROLE custom_role;
SELECT GET_DDL('view', 'aaa');

一方でSecure Viewの場合は、このようにエラーを返すことで、viewに定義されたSELECT文がわからないようになっています。viewに定義したSELECT文の内容が見えず、まさにSecureな状態であることがわかりますね。

USE ROLE custom_role;
SELECT GET_DDL('view', 'bbb');

Secure Viewの注意点

ここまでの説明で、「viewの定義内容を見せたくないし、それならもう全てのviewをSecure Viewにしちゃおうかな」と考えた方、1点だけ注意点があります。

それは、Secure Viewを使うと、クエリパフォーマンスに影響を及ぼす可能性があります。

これは、Secure Viewを使うと、Snowflakeがクエリパフォーマンスの最適化のために使用するクエリオプティマイザーが一部の最適化処理を行えなくなるためです。

そのため、すべてのviewをSecure Viewにするということを行ってしまうと、思わぬ所でパフォーマンス低下に繋がりますのでご注意ください。

どういった時に使えばいいの?

ではこのSecure View、いつ使えばいいのでしょうか。

例えばSnowflakeにはデータシェアリングの機能があり、viewも共有することができます。そんな時に、viewに定義したSQLに指標を出すために必要な計算ロジックなどを組み込んでおり、それを相手には見せたくない…というケースがあると思います。

そういった時に、このSecure Viewを使うことで詳細なロジックを相手に見せることなく、viewが返す結果だけを共有することが出来ます。

ただ、前述の注意点でも述べたとおりSecure Viewはパフォーマンスの低下に繋がる可能性がありますので、その点を考慮した上で適用してみてください。

次回

Snowflakeをより使いこなそう! Advent Calendar 2021、次回の5日目では、「Snowflakeのアンロードで単一ファイルと複数ファイルの違いを比較してみた #SnowflakeDB」というタイトルで執筆します。お楽しみに!