参照を使用した、オブジェクトへのアクセスの承認

参照を使用すると、デフォルトではオブジェクトにアクセスできないストアドプロシージャ、アプリケーション、またはクラスインスタンスに対して、オブジェクトへのアクセスを承認することができます。

このトピックの内容:

紹介

参照は識別子として使用できる文字列です。識別子は参照されるオブジェクトに解決します。

参照は以下をカプセル化します。

  • オブジェクト名。

  • オブジェクト参照の作成に使用されるアクティブなロールと、該当する場合はアクティブなセカンダリロール。

  • 参照が作成されるときに指定される、オブジェクトに対する権限。

参照が必要なシナリオには、以下のようなものがあります。

  • 所有者権限のストアドプロシージャ は、異なるロールが所有するテーブルにデータを挿入するためにアクセス権を必要とする。

  • アプリケーションはデータアナリティクスを実行し、テーブル内のデータへの読み取りアクセス権を必要とする。

  • SNOWFLAKE.ML.ANOMALY_DETECTION クラスのインスタンスは、異常検知 ML モデルの学習用にビューへの読み取りアクセスを必要とする。

名前で識別されるオブジェクト

参照は、オブジェクトを 名前で 識別します。つまり、参照を作成した後にオブジェクトの名前が変更された場合、その参照は無効になります。しかし、新しいオブジェクトに同じ名前が付けられている場合は、その参照が有効になる 可能性 があります。たとえば、ロール my_role が SELECT 権限でテーブル my_table1 に対する参照 my_ref1 を作成します。参照が作成された後、テーブル my_table1 がドロップされ、 my_table1 という名前の 新しい テーブルが作成されます。参照 my_ref1 は、名前が my_table1 のテーブルを識別します。この場合、 新しい テーブル my_table1 は識別されます。

参照の作成に使用されたロールと、 my_table1 に付与された権限がまだ有効である場合は、参照を使用する際に新しい my_table1 へのアクセスが承認されます。

参照でカプセル化されたロールと権限がすでに無効な場合は、テーブル my_table1 へのアクセスは承認されず、新しいテーブルに対して新しい参照を作成する必要があります。

実行時に検証される権限

参照を作成したロールに付与された権限は、参照が使用される時点で検証されます。たとえば、ロール my_role は SELECT 権限でテーブル t1 への参照を作成します。 my_role がドロップされるか、テーブル t1 に対する SELECT 権限が my_role から取り消されると、参照でカプセル化された権限は無効になります。テーブルに対する SELECT 権限を必要とするストアドプロシージャに参照が渡されると、ストアドプロシージャは権限エラーで失敗します。

参照の型と参照の有効期間

参照の有効期間は、作成時に指定することができます。

  • 一時的参照 の有効期間は限られており、その参照が渡される呼び出しの継続時間か、セッションの継続時間です。

  • 永続参照 の有効期間は無限です。参照は、参照先のオブジェクトがドロップされるか、参照の設定が解除されるか、参照が無効になるまで有効です。

    参照の設定解除の例については、 アプリケーションの永続参照の設定解除 をご参照ください。

    参照は、以下のいずれかの理由で無効になる可能性があります。

    • 参照するオブジェクトの名前が変更された。

    • 参照を作成したロールがドロップされた。

    • 参照を作成したロールに、オブジェクトに対する権限がなくなった。

    詳細については、 名前で識別されるオブジェクト および 実行時に検証される権限 をご参照ください。

所有者権限のストアドプロシージャの参照

所有者権限のストアドプロシージャ は、ストアドプロシージャを実行する 呼び出し元 の権限ではなく、 所有者 の権限で実行されます。呼び出し元がアクセス権限を持つテーブル、ビュー、関数に対してアクションを実行するには、呼び出し元はそのテーブル、ビュー、関数への参照を渡す必要があります。参照によって、ストアドプロシージャは、参照の作成者(この場合は呼び出し元)の権限で、参照が識別するオブジェクトに対してアクションを実行できるようになります。

アプリケーションおよびクラスの参照

設計上、アプリケーションやクラスには、アプリケーションがインストールされたアカウントやクラスのインスタンスが作成されたアカウント内にあるオブジェクトへのアクセス権が ありません。ユーザーは、参照を作成すると、アプリケーションやクラスのインスタンスにオブジェクトに対するアクセスを承認することができます。

アプリケーションおよびクラスのプロバイダーとコンシューマー

プロバイダー はアプリケーションを作成し、 コンシューマー はコンシューマーアカウントにアプリケーションをインストールして使用します。 Snowflakeクラス の場合、Snowflakeは プロバイダー であり、クラスのインスタンスを作成するSnowflakeアカウントを持つユーザーは コンシューマー です。

プロバイダーは、コード内で参照をリクエストしたり使用したりするアプリケーションやクラスを作成できます。詳細については、 プロバイダーの参照 をご参照ください。

コンシューマーは、自分のアカウントにインストールしたアプリケーションや、Snowflakeクラスのインスタンスへの参照を作成し、渡すことができます。詳細については、 コンシューマーの参照 をご参照ください。

参照でサポートされているターゲット

参照のターゲットはオブジェクトの場合もあればクエリの場合もあります。参照のターゲットがオブジェクトの場合、参照にはそのオブジェクトに対する権限が必要です。

参照のサポートされるオブジェクト型と権限

以下のテーブルに、参照に含めることのできるオブジェクトの型、作成できる参照の型、また各オブジェクトに許可される権限をリストします。

オブジェクト型

一時的

永続

許可される権限

デフォルト権限

DATABASE

APPLYBUDGET

SCHEMA

APPLYBUDGET

TABLE

APPLYBUDGET

SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES

SELECT

VIEW

SELECT, REFERENCES

SELECT

MATERIALIZED VIEW

APPLYBUDGET

EXTERNAL TABLE

SELECT, REFERENCES

SELECT

PIPE

APPLYBUDGET

APPLYBUDGET

TASK

APPLYBUDGET

APPLYBUDGET

FUNCTION

USAGE

USAGE

PROCEDURE

USAGE

USAGE

WAREHOUSE

APPLYBUDGET

MODIFY, MONITOR, OPERATE, USAGE

USAGE

API INTEGRATION

USAGE

USAGE

クエリ参照

クエリ参照 は一時的参照の一種です。これは、ストアドプロシージャにある別の SQL ステートメントの FROM 句で使用できる SELECT ステートメントを参照します。クエリ参照を作成するには、 SYSTEM$QUERY_REFERENCE 関数を使用します。

詳細については、 クエリ参照の使用 をご参照ください。

プロバイダーの参照

Snowflake Native App Framework を使用すると、プロバイダーとしてアプリケーションを作成できます。アプリケーションのコンシューマーからのリクエスト参照に関する詳細については、 コンシューマーに参照およびオブジェクトレベル権限をリクエストする をご参照ください。

コンシューマーの参照

SYSTEM$REFERENCE 関数を使用して参照を作成できます。関数が返す文字列識別子を、ストアドプロシージャ、アプリケーション、またはクラスインスタンスに渡すことができます。あるいは、文字列識別子の代わりに参照を作成するステートメントを渡すこともできます。

SELECT 権限でテーブル t1 へのセッションスコープを持つ一時参照を作成します。

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'SESSION', 'SELECT');
Copy

同じテーブルへの参照を、それが参照されるスコープの有効期間中(例: ストアドプロシージャに渡す場合、その有効期間はストアドプロシージャの一番外側にあるブロックの有効期間)に作成するには、以下のステートメントを実行します。

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'CALL', 'SELECT');
Copy

アプリケーションに渡す t1 テーブルへの永続参照を INSERT 権限で作成します。

SELECT SYSTEM$REFERENCE('TABLE', 't1', 'PERSISTENT', 'INSERT');
Copy

ストアドプロシージャに渡すクエリ参照を作成します。この一時的な参照の有効期間は、この参照を渡したストアドプロシージャの一番外側にあるブロックの有効期間です。

SELECT SYSTEM$QUERY_REFERENCE('SELECT id FROM my_table', FALSE);
Copy

その他の例:

アプリケーションの永続参照の設定解除

永続参照を必要とするアプリケーションやクラスは、参照の設定を解除するメソッドも提供します。メソッド名は実装によって異なる場合があります。

あるいは、 ALTER APPLICATION ... UNSET REFERENCES ステートメントを使用して参照を解除することもできます。

  1. SHOW REFERENCES コマンドを使用すると、アプリケーションに設定されている参照を含む、すべての参照を表示することができます。

    たとえば、アプリケーション my_app の参照を表示するには、次を実行します。

    SHOW REFERENCES IN APPLICATION my_app;
    
    Copy
  2. ALTER APPLICATION コマンドを使用すると、アプリケーションに設定されている参照を解除することができます。

    たとえば、アプリケーション my_apptable_to_read という名前の参照を解除するには、

    ALTER APPLICATION my_app UNSET REFERENCES('table_to_read');
    
    Copy

    たとえば、アプリケーション my_app 内のすべての参照を解除するには、

    ALTER APPLICATION my_app UNSET REFERENCES;
    
    Copy

参照を使用する際の考慮事項

  • 参照に関連付けられているオブジェクトの名前が変更(または再ペアレント化)された場合、その参照は無効になります。

    新しいオブジェクトが同じ名前で作成され、参照の関連付けでエンコードされたロールが新しいオブジェクトに関連する権限を持っている場合、参照は引き続き有効です。それ以外の場合は権限エラーで失敗します。

  • オブジェクトが入れ替えられ、参照の関連付けでエンコードされたロールが、名前を入れ替えられた新しいオブジェクトに関連する権限を持っている場合、参照は引き続き有効です。それ以外の場合は権限エラーで失敗します。

  • オブジェクトのドロップおよびドロップ解除:

    • 参照に関連付けられているオブジェクトがドロップされると、参照の関連付けは無効になります。

    • オブジェクトがドロップ解除されると、参照の関連付けは再び有効になります。

  • クローニング

    アカウント内のオブジェクトへの参照を使用するクラスインスタンス、またはその親データベースやスキーマをクローンできます。

    • 参照オブジェクトが完全修飾名で参照されている場合、インスタンスクローンは元のオブジェクトを参照します。

    • 参照されるオブジェクトが部分修飾名または非修飾名で参照されている場合、インスタンスクローンは、クローンの境界に応じて、クローンオブジェクト、元のオブジェクト、または実在しないオブジェクトを参照する可能性があります。

  • 複製は、コンシューマーアカウントのオブジェクトへの参照を使用するクラスインスタンスを含んでいる、アプリケーションまたはデータベースに対してサポートされます。

    以下のオブジェクトが複製されている限り、参照はターゲットアカウントで正しく機能します。

    • アプリケーションまたはクラスのインスタンス。

    • 参照されるオブジェクト。

    • 参照を作成したロール。

    これらのオブジェクトは、異なる複製グループやフェールオーバーグループに複製することができます。すべてのオブジェクトが複製された後、参照は使用できるようになります。

Snowflake Native App Frameworkアプリケーションのプロバイダーについては、 参照を使用する際の考慮事項 もご参照ください。

参照の使用状況のモニタリング

アプリケーションからリクエストされた参照は、 SHOW REFERENCES コマンドを使用して表示することができます。アプリケーションに参照を設定した場合、出力にはオブジェクト、データベース、スキーマ、各参照の識別子に関する情報が含まれます。

たとえば、アプリケーション my_app 内の参照を表示するには、

SHOW REFERENCES IN APPLICATION my_app;
Copy