Snowflakeで知っていると便利なコンテキスト関数についてまとめてみた #SnowflakeDB

2021.12.15

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

さがらです。

Snowflakeを使用する中で、今の環境や状態に関する情報がほしいときがあります。そんな時に役立つコンテキスト関数について本記事でまとめてみます。

コンテキスト関数とは?

ステートメントが実行されるコンテキスト(環境・状態)に関する情報を収集できます。

公式Doc上では、以下の3種類に分類されています。この記事でもこの3分類に分けてどんな関数があるか説明していきます。

  • 一般的なコンテキスト:現在の日時やログインしている環境のIPやリージョン情報を返します。
  • セッションコンテキスト:ログインしているユーザーに関するセッション情報、具体的にはアカウント名やロール名、直近実行したクエリIDなどを返します。
  • セッションオブジェクトコンテキスト:現在のセッション上での各種オブジェクトに関する情報、具体的にはデータベース名、テーブル名、クエリを実行するユーザーのロール情報、などを返します。

正直、コンテキスト関数はどれも使い方が簡単な上、覚えているとふとした時に役立つ関数が多いです!本記事では一部の関数にしか触れないため、より詳細は下記の公式Docよりご確認ください。

一般的なコンテキスト

現在の日時を返す

CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMPSYSDATEなどが該当します。関数名の通り、現在の日時に関するデータを返します。

下記がクエリサンプルです。

select current_date(), current_time(), current_timestamp();

現在のバージョンを返す

SnowflakeはSaaSのためバージョン管理はすべてSnowflake側で行います。しかし、「自分たちのアカウントでのSnowflakeのバージョンは何か?」とバージョン情報を知りたいということが稀にあるかと思います。

そんなときは、CURRENT_VERSION関数を使用すれば、すぐに現在の使用しているSnowflakeのバージョンを知ることが出来ます。下記がクエリサンプルです。

select current_version();

セッションコンテキスト

ロール周りの情報を返す

ロール周りの情報を返すセッションコンテキスト関数としては、CURRENT_ROLECURRENT_AVAILABLE_ROLESCURRENT_SECONDARY_ROLESといった関数があります。

それぞれ、以下の違いがあります。

  • CURRENT_ROLE:現在のセッションで使用中のロールを返します。
  • CURRENT_AVAILABLE_ROLES:現在ログインしているユーザーに付与されているロールのリストを返します。
  • CURRENT_SECONDARY_ROLES:現在のセッションで使用中のセカンダリロールの名前を返します。※別途SECONDARY ROLESの機能を有効化する必要があります。セカンダリロールの詳細はこちらの公式Docよりご確認ください。

直近実行したクエリのIDを返す

クエリIDを用いてタイムトラベルの機能を使用したりと、直近実行したクエリのIDを知りたいということは意外と多いものです。

そんなときは、LAST_QUERY_ID関数が役に立ちます。

直近最後に実行したクエリのIDを取得したい場合は、特に引数を指定することなく実行すればOKです。

select last_query_id();

直近何回か前に実行したクエリのIDを取得したい場合は、以下のように「-●」の値を引数に入れて実効すればOKです。

-- 直近に実行されたクエリのIDを返します ※引数なしと同じ結果を返します。
select last_query_id(-1);

-- 直近で2番目に実行されたクエリのIDを返します。
select last_query_id(-2);

セッションオブジェクトコンテキスト

現在クエリ対象として設定されているデータベースなどの情報を返す

現在クエリ対象として設定されている、データベース名、スキーマ名、などの情報を返します。WEBコンソール上では、ワークシートの画面右上で確認できる設定項目ですね。

それぞれの関数で、以下のように返す結果が異なっております。

  • CURRENT_DATABASE:コンテキストとして設定されている、クエリ対象のデータベース名を返します。
  • CURRENT_SCHEMA:コンテキストとして設定されている、クエリ対象のスキーマ名を返します。
  • CURRENT_SCHEMAS:現在の各コンテキストの設定でアクティブになっているスキーマへのパスの一覧を配列で返します。(例:["TEST_DB1.BILLING", "TEST_DB1.PUBLIC"])
  • CURRENT_WAREHOUSE:コンテキストとして設定されている、使用するウェアハウス名を返します。

行レベル・列レベルセキュリティに使える関数

セッションオブジェクトコンテキスト関数には、行レベル・列レベルセキュリティの設定(マスキングポリシーの定義)時に使用できる関数も用意されています。

  • INVOKER_ROLE:クエリを実行する際のロールを返します。マスキングポリシーのcase when句で使用することが多いと思います。
  • INVOKER_SHARE:対象のテーブルまたはビューにアクセスしたSHAREオブジェクト名を返します。
  • IS_GRANTED_TO_INVOKER_ROLEINVOKER_ROLE関数によって返されるロールが引数で指定されたロールの権限を継承する場合は、TRUEを返します。クエリを実行する際のロール名だけで判断するのではなく、他のロールを継承しているかどうかで判断したいときには、この関数がマスキングポリシーを定義する時に便利です。
  • IS_ROLE_IN_SESSION:セカンダリロールまで含めて、現在のセッションのユーザーが引数にいれたロールを継承している場合には、TRUEを返します。セカンダリロールの機能をONにしていて、継承しているかどうかをもとに判断したいときには、この関数がマスキングポリシーを定義する時に便利です。
  • POLICY_CONTEXT:別のロールであると仮定して、クエリを実行した時の効果をシミュレートしたいときに使用する関数です。詳細は公式Docをご覧ください。

次回

Snowflakeをより使いこなそう! Advent Calendar 2021、次回の16日目では、「Snowflakeで日付と時刻の関数を試してみた~構築・抽出編~」というタイトルで執筆します。お楽しみに!