Snowpipe で  STALLED_COMPILATION_ERROR となった時に確認したこと

Snowpipe で STALLED_COMPILATION_ERROR となった時に確認したこと

2025.11.29

はじめに

Snowpipe 構成時にSTALLED_COMPILATION_ERRORに遭遇したので、確認した内容を本記事でまとめてみます。

結論

UI 上からは直接的な原因の特定は難しいですが、SYSTEM$PIPE_STATUSを実行するとエラーメッセージが表示される可能性があります。特にSTALLED_COMPILATION_ERRORについては、パイプ作成ロールが、パイプ作成に必要な各種権限を有していない可能性があるため、権限周りを再度確認すると良い考えです。

試してみる

前提条件

以下の環境で検証しています。

  • クラウドリージョン:Azure Japaneast
  • Snowpipe:Microsoft Azure BLOBストレージ用 の Snowpipe

事前準備

Azure Blob ストレージを使用するパイプを構成します。こちらの手順の詳細は以下をご参照ください。

https://docs.snowflake.com/ja/user-guide/data-load-snowpipe-auto-azure

https://dev.classmethod.jp/articles/azure-blob-storage-snowpipe-snowflakedb/

ここでは、以下のコマンドで簡単に ACCOUNTADMIN でパイプ以外の必要なオブジェクトを作成しました。

USE ROLE ACCOUNTADMIN;

-- ストレージ統合
CREATE STORAGE INTEGRATION my_azure_storage_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'AZURE'
  ENABLED = TRUE
  AZURE_TENANT_ID = '<テナントID>'
  STORAGE_ALLOWED_LOCATIONS = ('azure://<ストレージアカウント>.blob.core.windows.net/<コンテナ>/');

DESC STORAGE INTEGRATION my_azure_storage_int;

-- サンプルテーブル・パイプ作成用のデータベース
CREATE DATABASE test_db;

-- 外部ステージ
CREATE STAGE my_azure_stage
STORAGE_INTEGRATION = my_azure_storage_int
URL = 'azure://<ストレージアカウント>.blob.core.windows.net/<コンテナ>/';

--ファイルフォーマット
CREATE OR REPLACE FILE FORMAT my_csv_format
  TYPE = CSV
  FIELD_DELIMITER = ','
  PARSE_HEADER = TRUE
  EMPTY_FIELD_AS_NULL = true
  COMPRESSION = AUTO;

-- 事前にサンプルデータをストレージに配置し、スキーマ検出機能によりテーブルを定義
CREATE OR REPLACE TABLE mytable
    USING TEMPLATE (
        SELECT ARRAY_AGG(OBJECT_CONSTRUCT(*))
        FROM TABLE(
            INFER_SCHEMA(
                LOCATION=>'@my_azure_stage/',
                FILE_FORMAT=>'my_csv_format',
                IGNORE_CASE => True
                )
            )
        );

-- ロードできることを確認
COPY INTO mytable
	FROM @my_azure_stage
	FILE_FORMAT=(FORMAT_NAME = 'my_csv_format')
	MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE;

--TRUNCATE TABLE MYTABLE;

/*==========
Snowpipe の設定
==========*/

--通知統合を作成
USE ROLE ACCOUNTADMIN;

CREATE NOTIFICATION INTEGRATION my_pipe_queue_int
  ENABLED = true
  TYPE = QUEUE
  NOTIFICATION_PROVIDER = AZURE_STORAGE_QUEUE
  AZURE_STORAGE_QUEUE_PRIMARY_URI = 'https://<ストレージアカウント>.queue.core.windows.net/<キュー>'
  AZURE_TENANT_ID = '<テナントID>';

DESC NOTIFICATION INTEGRATION my_pipe_queue_int;

パイプ管理用のロールを作成

パイプ作成には、統合オブジェクトも関わるのでデフォルトでは ACCOUNTADMIN の権限も必要です。このままでは権限が強すぎるので、開発者ロールなど、パイプ作成の権限を別途カスタムロールに持たせることは一般的と思います。

ここでは、以下の内容でパイプ管理者ロールとして作成しました。

-- ロールを作成
USE ROLE SECURITYADMIN;
CREATE ROLE pipe_admin;
GRANT ROLE pipe_admin TO ROLE SYSADMIN;

パイプ管理者ロールを作成後、パイプ作成に必要な権限を付与します。最低限必要な権限は以下の通りです。

GRANT USAGE ON DATABASE test_db TO ROLE pipe_admin;
-- パイプ作成先・サンプルテーブル作成先のスキーマ
GRANT USAGE ON SCHEMA test_db.public TO ROLE pipe_admin;
GRANT CREATE PIPE ON SCHEMA test_db.public TO ROLE pipe_admin;
GRANT USAGE ON INTEGRATION PIPE_QUEUE_INT TO ROLE pipe_admin;
GRANT USAGE ON STAGE test_db.public.my_azure_stage TO ROLE pipe_admin;
GRANT USAGE ON FILE FORMAT test_db.public.my_csv_format TO ROLE pipe_admin;
GRANT SELECT,INSERT ON TABLE test_db.public.mytable TO ROLE pipe_admin;

パイプを作成しロード

この状態でパイプを作成できます。

USE ROLE pipe_admin;

CREATE PIPE mypipe
AUTO_INGEST = true
INTEGRATION = 'PIPE_QUEUE_INT'
AS
COPY INTO test_db.public.mytable
  FROM @test_db.public.my_azure_stage/
  FILE_FORMAT=(FORMAT_NAME = 'my_csv_format')
	MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE;

問題なければ UI だと下図のように表示されます。

image

ファイルが配置されるとロードされます。

image 1

権限が足りない場合

ここで例として、一部権限が足りない場合の動作を見てみます。

  • ファイルフォーマットの使用権限がない場合
-- ファイルフォーマットの使用権限を削除
USE ROLE SECURITYADMIN;
REVOKE USAGE ON FILE FORMAT test_db.public.my_csv_format FROM ROLE pipe_admin;

この時点では、パイプステータス上は問題ないように見えます。(コマンドでも同様)

image 2

新しいファイルがストレージに配置されても、ロード処理そのものが行われません。
このタイミングでステータスも更新され、ここではSTALLED_COMPILATION_ERRORとなりました。

image 3

UI 上は具体的なエラー原因がわかりづらいのですが、SYSTEM$PIPE_STATUS を実行するとエラーメッセージが表示される場合があります。

SELECT SYSTEM$PIPE_STATUS('mypipe');

出力のerrorからファイルフォーマットへの権限がないことがわかります。

{
	"executionState":"STALLED_COMPILATION_ERROR",
	"pendingFileCount":0,
	"error":"SQL compilation error:\nFile format 'MY_CSV_FORMAT' does not exist or not authorized.",
	"lastIngestedTimestamp":"2025-11-29T02:29:27.241Z","lastIngestedFilePath":"sample_data_20240412.csv",
	"notificationChannelName":"https://<ストレージアカウント>.queue.core.windows.net/<キュー>",
	"numOutstandingMessagesOnChannel":1,"lastReceivedMessageTimestamp":"2025-11-29T02:44:31.675Z",
	"lastForwardedMessageTimestamp":"2025-11-29T02:44:32.284Z",
	"lastPulledFromChannelTimestamp":"2025-11-29T02:46:51.666Z",
	"lastForwardedFilePath":"<ストレージアカウント>.blob.core.windows.net/<コンテナ>/sample_data_20240413.csv",
	"pendingHistoryRefreshJobsCount":0
}

テーブルの参照権限がない場合

参考までにテーブルに対する SELECT 権限がない場合は、UI 上で下図のように表示されます。

image 4

さいごに

Snowpipe 構成時のSTALLED_COMPILATION_ERRORの原因調査を試してみました。SYSTEM$PIPE_STATUS でエラーメッセージが表示されることがあります。
本記事の内容が何かの参考になれば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事