Snowpark Container Services: SQL 実行

アプリケーションコンテナがSnowflakeに接続して SQL を実行できます。このトピックでは、コンテナコードが、認証情報、サービスのデータベースとスキーマコンテキスト、 SQL ステートメントの実行に使用されるウェアハウスなど、Snowflakeに接続するために必要な情報を取得する方法について説明します。

認証情報構成オプション

Snowflakeは、 SQL を実行するときに、アプリケーションコンテナがSnowflake提供の認証情報を使用してSnowflakeに対して認証することを推奨します。外部アクセス統合(EAI)を介して接続することで、他の認証情報を使用することは可能ですが、 EAI を介して接続する場合、Snowflakeの外部で実行され、インターネット経由でSnowflakeに接続しているかのようにサービスを扱います。

サービスコンテナからSnowflakeに接続するには、次の3つのオプションがあります。

  • **Snowflakeが提供するサービスユーザー認証情報を使用する: ** Snowflakeが提供するすべてのサービスに、サービス認証情報と呼ばれる認証情報があります。サービスはこれらの認証情報を使用して、サービスユーザーとしてSnowflakeに接続します。

  • **Snowflakeが提供する呼び出し元認証情報(呼び出し元権限)を使用する: ** 呼び出し元権限でサービスを構成すると、Snowflakeは呼び出しユーザーとしてSnowflakeに接続するための、サービスの認証情報も提供します。

  • 他の認証情報を使用する: この場合は、有効な認証情報を使用して、サービスをSnowflakeのインターネットエンドポイントに接続できる外部アクセス統合(EAI)を使用します。このオプションを使用するには、管理者が EAI を作成してから、サービス所有者ロールへの統合に対する USAGE 権限を付与する必要があります。

    注釈

    外部アクセス統合を使用してSnowflakeにアクセスすることは、潜在的にセンシティブな情報をインターネット経由で送信することを意味します。

Snowflakeに接続するためにさまざまなSnowflakeドライバーを使用するコードの例については、 Snowflake接続サンプル をご参照ください。

Snowflakeが提供するサービスユーザー認証情報の使用

Snowflakeが提供するサービス認証情報を使用する場合は、以下のような影響に注意してください。

  • Snowflakeのすべてのオブジェクトには、オブジェクトを作成するために使用されるロールである 所有者ロール があります。サービスの所有者ロールは、サービスがSnowflakeと相互作用する際に、サービスが許可される機能を決定します。これらの機能には SQL の実行、ステージへのアクセス、サービス間のネットワーキングが含まれます。

  • サービスを作成すると、Snowflakeはそのサービス専用のサービスユーザーも作成します。そのサービスユーザーは、サービス所有者ロールと 'PUBLIC' ロールという2つのロールにのみアクセスできます。サービスユーザーの既定のロールはサービス所有者ロールです。

ジョブサービスを含むサービスを開始すると、Snowflakeはいくつかのアクションを実行します。各アプリケーションコンテナで、SnowflakeはコンテナコードがSnowflakeに接続して SQL を実行するためのドライバーを使用できるようにします。これは、Snowflakeに接続するコンピューター上の他のコードと同様です。次のリストは、サービスの開始時にSnowflakeが実行するアクションを示しています。

  • コンテナ内の認証情報( OAuth トークン)を /snowflake/session/token という名前のファイルで提供します。コンテナコードは、これらの認証情報を使用してサービスユーザーとして認証します。この OAuth トークンはSnowpark Container Services外部では使用できません

  • サービスコード内でSnowflakeクライアントを構成するために、以下の環境変数を設定します。

    • SNOWFLAKE_ACCOUNT:この変数は、サービスが現在実行されているSnowflakeアカウントの アカウントロケーター に設定されます。

    • SNOWFLAKE_HOST:この変数は、Snowflakeへの接続に使用されるホスト名を指定します。

サービスユーザーとしてSnowflakeへの接続を作成する場合、コンテナコードは SNOWFLAKE_HOST、 SNOWFLAKE_ACCOUNT、および OAuth トークンを使用する必要があります。OAuth トークンは SNOWFLAKE_HOST を使用しないと使用できません。

チュートリアル2main.py を参照)で、コードは次の例に示すように環境変数を読み取ります。

SNOWFLAKE_ACCOUNT = os.getenv('SNOWFLAKE_ACCOUNT')
SNOWFLAKE_HOST = os.getenv('SNOWFLAKE_HOST')
Copy

このコードは、これらの変数を選択したSnowflakeクライアントの接続作成コードに渡します。コンテナはこれらの認証情報を使用して、サービスの所有者ロールをセッションのプライマリロールとする新しいセッションを作成し、クエリを実行します。以下の例は、PythonでSnowflake接続を作成するために最低限必要なコードを示しています。

def get_login_token():
  with open('/snowflake/session/token', 'r') as f:
    return f.read()

conn = snowflake.connector.connect(
  host = os.getenv('SNOWFLAKE_HOST'),
  account = os.getenv('SNOWFLAKE_ACCOUNT'),
  token = get_login_token(),
  authenticator = 'oauth'
)
Copy

この OAuth トークンについては、次の点に注意してください。

  • Snowflakeは /snowflake/session/token ファイルのコンテンツを数分ごとに更新します。すべてのトークンは最大で1時間有効です。コンテナがSnowflakeに正常に接続した後には、有効期限は接続に適用されません。これはユーザーが直接作成するセッションでのケースと同様です。

  • この OAuth トークンは、特定のSnowflakeサービス内でのみ有効です。OAuth トークンをコピーしてサービス外部で使用することはできません。

  • OAuth トークンを使用して接続する場合、新しいセッションが作成されます。OAuth トークンはいずれの既存の SQL セッションとも関連付けられていません。

    注釈

    ストアドプロシージャの実行とサービスの実行の大きな違いは、ストアドプロシージャはプロシージャを実行する SQL と同じセッションで実行されることです。しかし、コンテナが新しい接続を確立するたびに、新しいセッションが作成されます。

特定のサービスユーザーが発行したクエリを表示するには、 ACCOUNTADMIN ロールを使用して、 クエリ履歴 を表示できます。サービス利用者の利用者名は以下の形式で表示されます。

  • 8.35サーバーリリース以前に作成されたサービスの場合、サービスユーザー名は SF$SERVICE$unique-id の形式です。

  • 8.35サーバーリリース以降に作成されたサービスでは、サービスユーザー名はサービス名と同じです。

注釈

サービスの所有者ロールは、サービスを作成したロールです。1つ以上のサービスロールを定義して、サービスが公開するエンドポイントへのアクセスを管理することができます。詳細については、 サービス関連権限の管理 をご参照ください。

Snowflakeが提供する呼び出し元認証情報(呼び出し元権限)の使用について

特定のアプリケーションシナリオでは、前述のとおり、サービスユーザーではなくエンドユーザーのコンテキストを使用してクエリを実行する必要があるかもしれません。このような場合に使用されるのが、「呼び出し元権限」の機能です。

たとえば、Snowflakeに保存されたデータを使用するダッシュボードを表示するウェブアプリケーション用に、パブリックエンドポイントを公開するサービスを作成したとします。Snowflakeアカウントの他のユーザーに サービスロール を付与することで、ユーザーにダッシュボードへのアクセス権を付与します。ユーザーがサインインすると、ダッシュボードには、ユーザーがアクセスを許可されているデータのみが表示されます。

ただし、コンテナはデフォルトでサービスユーザーとサービスの所有者ロールを使用してクエリを実行するため、ダッシュボードには、エンドポイントに接続したエンドユーザーに関係なく、サービスの所有者ロールがアクセスできるデータが表示されます。その結果、ダッシュボードは、エンドユーザーがアクセスを許可されたデータに限定されないため、サインインしたユーザーはアクセスしてはならないデータを表示できるようになります。

サインインしているユーザーがアクセスできるデータのみを表示するようにダッシュボードを制限するには、アプリケーションコンテナがエンドユーザーに付与された権限を使用して SQL を実行する必要があります。アプリケーションで呼び出し元権限を使用することで、これを有効にすることができます。

注釈

  • 呼び出し元権限機能は、ネットワーク・イングレスを使用して サービス にアクセスする場合にのみサポートされます。サービス関数を使用してサービスにアクセスする場合は、この機能は使用できません。

  • 呼び出し元権限の機能は現在、 Snowflake Native App (コンテナー付きアプリ)ではサポートされていません。

サービスの呼び出し元権限の構成

アプリケーションの呼び出し元権限を構成する手順には、2つのステップがあります。

  1. 次の仕様で示すとおり、サービス仕様 の``executeAsCaller`` を true にセットします。

    spec:
      containers:
      ...
    capabilities:
      securityContext:
        executeAsCaller: true
    
    Copy

    この設定によりSnowflakeは、アプリケーションが呼び出し元権限を使用する意図があることを伝え、リクエストをアプリケーションコンテナに送信する前に、すべての受信リクエストに Sf-Context-Current-User-Token ヘッダーを挿入します。このユーザートークンは、呼び出しユーザーとしてのクエリ実行を容易にします。指定がない場合、 executeAsCaller のデフォルトは false です。

    executeAsCaller オプションを指定しても、サービスユーザーおよびサービスの所有者ロールとしてクエリを実行するサービスの能力には影響しません。executeAsCaller を有効にすると、サービスには、通話ユーザーとしてもサービスユーザーとしてもSnowflakeに接続するオプションがあります。

  2. 呼び出しユーザーの代わりにSnowflake接続を確立するには、アプリケーションコードを更新して、Snowflakeがサービス <label-snowpark_containers_connect_to_snowflake>` に提供した OAuth トークンと、``Sf-Context-Current-User-Token` ヘッダーのユーザートークンの両方を含むログイントークンを作成します。

    ログイントークンはこの形式( <service-oauth-token>.<Sf-Context-Current-User-Token> )に従う必要があります。

    この更新は以下のPythonコードで示されています。

    # Environment variables below will be automatically populated by Snowflake.
    SNOWFLAKE_ACCOUNT = os.getenv("SNOWFLAKE_ACCOUNT")
    SNOWFLAKE_HOST = os.getenv("SNOWFLAKE_HOST")
    
    def get_login_token():
        with open("/snowflake/session/token", "r") as f:
            return f.read()
    
    def get_connection_params(ingress_user_token = None):
        # start a Snowflake session as ingress user
        # (if user token header provided)
        if ingress_user_token:
            logger.info("Creating a session on behalf of the current user.")
            token = get_login_token() + "." + ingress_user_token
        else:
            logger.info("Creating a session as the service user.")
            token = get_login_token()
    
        return {
            "account": SNOWFLAKE_ACCOUNT,
            "host": SNOWFLAKE_HOST,
            "authenticator": "oauth",
            "token": token
        }
    
    def run_query(request, query):
        ingress_user_token = request.headers.get('Sf-Context-Current-User-Token')
        # ingress_user_token is None if header not present
        connection_params = get_connection_params(ingress_user_token)
        with Session.builder.configs(connection_params).create() as session:
          # use the session to execute a query.
    
    Copy

上記の例では、

  • get_login_token 関数は、コンテナーが使用する OAuth トークンを Snowflake がコピーしたファイルを読み込みます。

  • get_connection_params 関数は、 OAuth トークンと Sf-Context-Current-User-Token ヘッダーのユーザートークンを連結してトークンを構築します。関数は、アプリケーションがSnowflakeに接続するために使用するパラメーターの辞書にこのトークンを含めます。

注釈

サービスが呼び出し元権限を使用する場合、複数のユーザーとしてSnowflakeに接続できます。Snowflakeで管理されていないリソースへのアクセスを管理する責任はご自身にあります。

たとえば、Streamlitアプリでは、 st.connection オブジェクトは、グローバル状態にある st.cache_resource を使用して接続を自動的にキャッシュし、異なるユーザーによって開始されたStreamlitセッション間でアクセスできるようにします。呼び出し元権限を使用する場合は、 st.session_state を使用してセッションごとに接続を保存し、ユーザー間で接続を共有しないようにしてください。

ステップバイステップの手順の例については、 呼び出し元権限を有効にしたサービスの作成 をご覧ください。

呼び出し元権限が構成されたサービスへのアクセス

呼び出し元権限の構成とは、呼び出し元に代わってお客様のサービスがSnowflake接続を確立することです。サービスのイングレス・エンドポイントへのログイン方法(プログラムまたはブラウザを使用)は変わりません。ログイン後、次の動作とオプションが適用されます。

  • ブラウザを使用したパブリックエンドポイントへのアクセス: エンドポイントにログインすると、サービスはユーザーの既定のロールを使用して、呼び出しユーザーの代わりにSnowflake** への接続を確立します。ユーザーに既定のロールが構成されていない場合、 PUBLIC ロールが使用されます。

  • プログラムによるパブリックエンドポイントへのアクセス: JWT トークンを使ってプログラムで のエンドポイントにログインする場合、オプションで scope パラメーターを設定して、有効化するロールを指定することができます。

現在、サービスが呼び出し元に代わってSnowflakeへの正しい接続を確立した後、ロールの切り替えはサポートされていません。アプリケーションで異なるオブジェクトへのアクセスに異なるロールを使用する必要がある場合は、ユーザーのデフォルトのセカンダリロールプロパティを変更する必要があります。

  • デフォルトですべてのセカンダリロールがアクティブになるようにユーザーを設定するには、次の例で示すように、 ALTER USER コマンドを使用してユーザーの DEFAULT_SECONDARY_ROLES プロパティを( 'ALL' )に設定します。

ALTER USER my_user SET DEFAULT_SECONDARY_ROLES = ( 'ALL' );
Copy

サービスへの呼び出し元グラントの管理

サービスが呼び出し元権限セッションを作成する場合、セッションはサービスユーザーとして ではなく 、呼び出し元のユーザーとして操作されます。このセッションを使用して操作が実行されると、Snowflakeは2つの権限チェックのシーケンスを適用します。

  1. 最初の権限のチェックは、ユーザーが直接セッションを作成したかのように行われます。このチェックは、Snowflakeがユーザーに対して行う通常の権限チェックの一部です。

  2. 2つ目の権限チェックは、サービスがユーザーに代わって操作を実行することを許可されているかどうかを確認します。Snowflakeは、サービスの所有者ロールに必要な呼び出し元グラントが付与されていることを確認することで、これを検証します。

呼び出し元権限セッションにおいて、通常の権限チェックとサービス所有者ロールの 呼び出し元権限 チェックの両方が、その操作を許可しなければなりません。これは、 制限された呼び出し元権限 と呼ばれます。デフォルトでは、サービスはユーザーに代わって何かをする権限を持っていません。サービスが呼び出し元権限で実行できるように、呼び出し元権限を明示的に付与する必要があります。

たとえば、ユーザー U1 が、テーブル T1 の SELECT 権限を持つロール R1 を使用しているとします。U1 が、呼び出し元権限を使用するように構成されたあなたのサービス (example_service) のパブリックエンドポイントにログインすると、サービスは U1 に代わって Snowflake との接続を確立します。

サービスが U1 に代わってテーブル T1 をクエリできるようにするには、サービスの所有者ロールに以下の権限を付与する必要があります。

  • そのテーブルのデータベースとスキーマに対して、 USAGE 権限でサービスを実行することを許可する呼び出し元グラントを付与することで、テーブル名を解決する権限です。

  • サービスをウェアハウス上で USAGE 権限で実行できるようにする呼び出し元グラントを付与することで、クエリを実行するためにウェアハウスを使用する権限です。

  • テーブル T1 の SELECT 権限でサービスを実行できる呼び出し元グラントを付与することで、テーブルにクエリを実行できる権限です。

以下の例は、これらの権限を持つサービスの所有者ロールを付与する方法を示しています。

-- Permissions to resolve the table's name.
GRANT CALLER USAGE ON DATABASE <db_name> TO ROLE <service_owner_role>;
GRANT CALLER USAGE ON SCHEMA <schema_name> TO ROLE <service_owner_role>;
-- Permissions to use a warehouse
GRANT CALLER USAGE ON WAREHOUSE <warehouse_name> TO ROLE <service_owner_role>;
-- Permissions to query the table.
GRANT CALLER SELECT ON TABLE T1 TO ROLE <service_owner_role>;
Copy

あなたのアカウントでグローバル権限(MANAGE CALLER GRANT)を持つロールであれば、呼び出し元グラントを付与することができます。呼び出し元権限の詳細については、 GRANT CALLER および 制限された呼び出し元権限 をご参照ください。

ユーザーに代わって SQL クエリを実行する際に、呼び出し元権限機能を使用するサービスの例を示します。詳細情報については、 呼び出し元権限を有効にしたサービスの作成 をご覧ください。

他の認証情報を使用してSnowflakeに接続する

Snowflakeが提供する OAuth トークンだけでなく、他の形式の認証を使用してSnowflakeに接続できます。そのためには、コンテナがSnowflakeの外部で実行され、インターネットを介して接続しているかのように、コンテナがSnowflakeに接続できるようにする外部アクセス統合(EAI)を作成します。 この方法で接続する場合は、クライアントが使用するホストを構成する必要はありません。

注釈

これらの接続は EAI を通過するため、Snowflake認証もネットワークポリシーを強制します。ビジネスでネットワークポリシーが必要な場合は、他の認証情報との接続はサポートされません。

たとえば、以下の接続では、認証するユーザー名とパスワードを指定します。

conn = snowflake.connector.connect(
  account = '<acct-name>',
  user = '<user-name>',
  password = '<password>'
)
Copy

デフォルトホスト名を使用するには、お客様のサービスからアカウントのSnowflakeインターネットホスト名へのアクセスを許可するネットワークルールと外部アクセス統合が必要です。例えば、アカウント名が組織 MYORG 内の MYACCOUNT の場合、ホスト名は myorg-myaccount.snowflakecomputing.com です。詳細については、 ネットワークエグレスの構成 をご参照ください。プライベートリンク ホスト名はサポートされていません

  • アカウントのSnowflake APIホスト名に一致するネットワークルールを作成します。

    CREATE OR REPLACE NETWORK RULE snowflake_egress_access
      MODE = EGRESS
      TYPE = HOST_PORT
      VALUE_LIST = ('myorg-myaccount.snowflakecomputing.com');
    
    Copy
  • 先行するネットワークルールを使用する統合を作成します。

    CREATE EXTERNAL ACCESS INTEGRATION snowflake_egress_access_integration
      ALLOWED_NETWORK_RULES = (snowflake_egress_access)
      ENABLED = TRUE;
    
    Copy

SQL を実行するためのデータベースとスキーマコンテキストの設定

Snowflakeは、認証情報を提供するだけでなく、サービスが作成されるデータベースとスキーマコンテキストも提供します。コンテナコードはこの情報を使用して、サービスと同じデータベースとスキーマコンテキスト内で SQL を実行できます。

このセクションでは、2つの概念について説明します。

  • サービスを作成するデータベースとスキーマを決定するためにSnowflakeが使用するロジック。

  • Snowflakeがこの情報をコンテナーに伝え、コンテナーコードが同じデータベースとスキーマコンテキストで SQL を実行できるようにするためのメソッド。

Snowflakeはサービス名を使用して、サービスを作成するデータベースとスキーマを決定します。

  • 例1: 以下の CREATE SERVICE および EXECUTE JOB SERVICE コマンドでは、サービス名が明示的にデータベース名とスキーマ名を指定していません。Snowflakeは、現在のデータベースとスキーマでサービスとジョブサービスを作成します。

    -- Create a service.
    CREATE SERVICE test_service IN COMPUTE POOL ...
    
    -- Execute a job service.
    EXECUTE JOB SERVICE
      IN COMPUTE POOL tutorial_compute_pool
      NAME = example_job_service ...
    
    Copy
  • 例2: 以下の CREATE SERVICE と EXECUTE JOB SERVICE コマンドでは、サービス名にデータベース名とスキーマ名が含まれています。Snowflakeは、現在のスキーマに関係なく、指定されたデータベース(test_db)とスキーマ(test_schema)にサービスとジョブサービスを作成します。

    -- Create a service.
    CREATE SERVICE test_db.test_schema.test_service IN COMPUTE POOL ...
    
    -- Execute a job service.
    EXECUTE JOB SERVICE
      IN COMPUTE POOL tutorial_compute_pool
      NAME = test_db.test_schema.example_job_service ...
    
    Copy

Snowflakeがサービスを開始する際は、以下の環境変数を使用して、実行中のコンテナにデータベースとスキーマ情報が提供されます。

  • SNOWFLAKE_DATABASE

  • SNOWFLAKE_SCHEMA

コンテナーコードでは、この例に示すように、接続コードで環境変数を使用して、使用するデータベースとスキーマを決定することができます。

conn = snowflake.connector.connect(
  host = os.getenv('SNOWFLAKE_HOST'),
  account = os.getenv('SNOWFLAKE_ACCOUNT'),
  token = get_login_token(),
  authenticator = 'oauth',
  database = os.getenv('SNOWFLAKE_DATABASE'),
  schema = os.getenv('SNOWFLAKE_SCHEMA')
)
Copy

チュートリアル2 では、Snowflakeに接続して SQL ステートメントを実行するSnowflakeジョブサービスを作成します。以下のステップは、チュートリアルのコードがどのように環境変数を使用するかをまとめたものです。

  1. 共通セットアップ(共通セットアップ セクションを参照)では、データベースとスキーマを含む、リソースを作成します。また、セッションの現在のデータベースとスキーマも設定します。

    USE DATABASE tutorial_db;
    ...
    USE SCHEMA data_schema;
    
    Copy
  2. (EXECUTE JOB SERVICE を実行して)ジョブサービスを作成すると、Snowflakeはコンテナを起動し、コンテナ内の以下の環境変数をセッションの現在のデータベースとスキーマに設定します。

    • SNOWFLAKE_DATABASE は「TUTORIAL_DB」に設定

    • SNOWFLAKE_SCHEMA は「DATA_SCHEMA」に設定

  3. ジョブコード(チュートリアル2の main.py を参照)はこれらの環境変数を読み取ります。

    SNOWFLAKE_DATABASE = os.getenv('SNOWFLAKE_DATABASE')
    SNOWFLAKE_SCHEMA = os.getenv('SNOWFLAKE_SCHEMA')
    
    Copy
  4. ジョブコードは SQL ステートメント(main.pyrun_job() 関数)を実行するコンテキストとしてデータベースとスキーマを設定します。

    {
       "account": SNOWFLAKE_ACCOUNT,
       "host": SNOWFLAKE_HOST,
       "authenticator": "oauth",
       "token": get_login_token(),
       "warehouse": SNOWFLAKE_WAREHOUSE,
       "database": SNOWFLAKE_DATABASE,
       "schema": SNOWFLAKE_SCHEMA
    }
    ...
    
    Copy

    注釈

    SNOWFLAKE_ACCOUNT、SNOWFLAKE_HOST、 SNOWFLAKE_DATABASE、 SNOWFLAKE_SCHEMA はSnowflakeがアプリケーションコンテナー用に生成する環境変数ですが、 SNOWFLAKE_WAREHOUSE はそうではありません(Snowflakeはウェアハウス名をコンテナーに渡さないため、チュートリアル2のアプリケーションコードがこの変数を作成しました)。

コンテナー用ウェアハウスの指定

サービスがSnowflakeに接続してSnowflakeウェアハウスでクエリを実行する場合は、ウェアハウスを指定する以下のオプションがあります。

  • アプリケーションコードでウェアハウスを指定します。 コードでクエリを実行するためにSnowflakeセッションを開始する際に、接続構成の一部としてウェアハウスを指定します。例については、 チュートリアル2 をご参照ください。

  • サービスの作成時にデフォルトのウェアハウスを指定します。 デフォルトのウェアハウスを指定するには、 CREATE SERVICE または EXECUTE JOB SERVICE コマンドでオプションの QUERY_WAREHOUSE パラメーターを指定します。アプリケーションコードが接続構成の一部としてウェアハウスを提供しない場合、Snowflakeはデフォルトのウェアハウスを使用します。ALTER SERVICE コマンドを使用して、デフォルトウェアハウスを変更します。

    注釈

    QUERY_WAREHOUSE パラメーターを使用して指定されたウェアハウスは サービスユーザー のみのデフォルトです。サービスが他のユーザーに代わってSnowflakeに接続するとき、呼び出し元権限のシナリオ のコンテキストにおいて、Snowflakeはユーザーのデフォルトのウェアハウスを使用します。

両方のメソッドでウェアハウスを指定した場合は、アプリケーションコードで指定されたウェアハウスが使用されます。

アクセスサービスユーザーのクエリ履歴

user_type が SNOWFLAKE_SERVICE の QUERY_HISTORY ビュー または QUERY_HISTORY 機能をフィルタリングすることで、サービスユーザーとしてサービスによって実行されたクエリを見つけることができます。

例1: サービスによって実行されるフェッチクエリ。

SELECT *
FROM snowflake.account_usage.query_history
WHERE user_type = 'SNOWFLAKE_SERVICE'
AND user_name = '<service_name>'
AND user_database_name = '<service_db_name>'
AND user_schema_name = '<service_schema_name>'
order by start_time;
Copy

WHERE 句で、

  • user_name = '<service_name>':サービスは サービスユーザー としてクエリを実行し、サービスユーザーの名前はサービス名と同じであるため、サービス名をユーザー名として指定します。

  • user_type = 'SNOWFLAKE_SERVICE' および user_name = '<service_name>': これはクエリ結果を、あるサービスによって実行されたクエリのみを取得するように制限します。

  • user_database_name および user_schema_name: サービスユーザーにとって、これらはサービスのデータベースとスキーマです。

QUERY_HISTORY 関数を呼び出しても同じ結果が得られます。

SELECT *
FROM TABLE(<service_db_name>.information_schema.query_history())
WHERE user_database_name = '<service_db_name>'
AND user_schema_name = '<service_schema_name>'
AND user_type = 'SNOWFLAKE_SERVICE'
AND user_name = '<service_name>'
order by start_time;
Copy

WHERE 句で、

  • user_type = 'SNOWFLAKE_SERVICE' および user_name = '<service_name>' は、あるサービスによって実行されたクエリのみを取得するようにクエリ結果を制限します。

  • user_database_nameuser_schema_name の名前は、サービスユーザーの場合、サービスのデータベースとスキーマです。

例2: サービスによって実行されたクエリと対応するサービス情報を取得します。

SELECT query_history.*, services.*
FROM snowflake.account_usage.query_history
JOIN snowflake.account_usage.services
ON query_history.user_name = services.service_name
AND query_history.user_schema_id = services.service_schema_id
AND query_history.user_type = 'SNOWFLAKE_SERVICE'
Copy

このクエリは、 QUERY_HISTORY と SERVICES ビューを結合し、クエリとクエリを実行したサービスに関する情報を取得します。次の点に注意してください。

  • サービスによって実行されるクエリの場合、 query_history.user_name は、サービスユーザー名です。これは、サービス名と同じです。

  • クエリは、スキーマ IDs (スキーマ名ではない)を使用してビューを結合し、同じスキーマを参照していることを確認します。スキーマをドロップして再作成すると、スキーマ ID は変更されますが、名前は同じままだからです。

クエリにオプションのフィルターを追加することができます。例:

  • 特定のクエリを実行したサービスのみを取得するためのフィルター query_history

  • 特定のサービスによって実行されたクエリのみを取得するためのフィルター services

例3: すべてのサービスについて、サービスユーザー情報をフェッチします。

SELECT services.*, users.*
FROM snowflake.account_usage.users
JOIN snowflake.account_usage.services
ON users.name = services.service_name
AND users.schema_id = services.service_schema_id
AND users.type = 'SNOWFLAKE_SERVICE'
Copy

このクエリは、 ACCOUNT_USAGE スキーマの SERVICES と USERS ビューを結合し、サービスとサービスユーザー情報を取得します。次の点に注意してください。

  • サービスがクエリを実行すると、サービスユーザーとしてクエリを実行します。サービスユーザーの名前はサービス名と同じです。したがって、結合条件 users.name = services.service_name を指定します。

  • サービス名はスキーマ内でのみ一意です。したがって、クエリは、各サービスユーザーが所属する固有のサービス(そして、異なるスキーマで実行されている他の同じ名前のサービスではない)に対して一致することを確実にするために、結合条件(users.schema_id = services.service_schema_id)を指定します。