Snowflake CLI でリポジトリ ステージの複数ファイル実行時に一時ステージに対する権限不足でつまずいたこと
はじめに
Snowflake CLI でリポジトリ ステージから複数の SQL ファイルを実行する際に、コンテキストが変わると一部のファイルを実行できなくなる場面があったので、調べた内容をまとめてみます。
結論
先に結論ですが、Snowflake CLI でリポジトリ ステージのファイルを実行する際は、Snowflake CLI の接続設定で一時的なステージを作成し、リポジトリ ステージのファイルをコピー・実行するようです。
そのため、SQL ファイル内でコンテキストを変更していると、この一時ステージにアクセスできず一部のファイルが実行できずにいました。
前提
以下の環境を使用しています。
- Snowflake CLI version: 3.4.1
環境の用意
リポジトリステージの作成
はじめに GitHub 側でリモートリポジトリを用意し、Snowflake のリポジトリステージと紐づけます。こちらの手順は以下をご参照ください。
Snowflake CLI の接続設定
ローカル環境から Snowflake CLI で対象のアカウントに対する接続設定を行います。
$ snow connection add
Enter connection name: my_connection
省略
Wrote new connection my_default_connection to /home/<ユーザー名>/.config/snowflake/config.toml
作成したコネクションをデフォルトにしておきました。
snow connection set-default my_connection
ここでは以下の接続情報を使用しました。
検証目的なので、簡単にパスワードでの認証を使用し、権限も強いものを使用している点はご注意ください。
[connections.my_connection]
account = "<組織>-<アカウント>"
user = "<ユーザー名>"
password = "パスワード"
role = "ACCOUNTADMIN"
SQL ファイルを作成
続けて以下の 2種類の SQL ファイルを作成しました。内容は簡単なものですが、ポイントとしてUSEコマンドでロールのコンテキストを SYSADMIN に指定しています。
USE ROLE SYSADMIN;
CREATE OR ALTER DATABASE sampledb;
USE ROLE SYSADMIN;
CREATE OR ALTER WAREHOUSE my_wh
WAREHOUSE_SIZE = XSMALL
AUTO_SUSPEND = 60
INITIALLY_SUSPENDED=TRUE;
リポジトリステージを更新
リモート リポジトリに変更を反映し、GitHub 上の変更を Snowflake のリポジトリステージにも反映します。
$ git add .
$ git commit -m "added sample sql"
$ git push -u origin main
# リポジトリステージを更新
$ snow git fetch governance.integrations.snowflake_extensions
# リポジトリステージを確認
$ snow git list-files '@snowflake_extensions/branches/main/' --database governance --schema integrations
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| name | size | md5 | sha1 | last_modified |
|-------------------------------------------------------------+------+------+------------------------------------------+------------------------------|
| snowflake_extensions/branches/main/README.md | 13 | None | 7bbfd835b8c97dabe36ee4a08b8fd787e407ac8a | Thu, 8 May 2025 02:41:11 GMT |
| snowflake_extensions/branches/main/sql/create_database.sql | 54 | None | 5f2ef3dce3696cf8b3e06730c5f5e42e0f13df3b | Thu, 8 May 2025 02:41:11 GMT |
| snowflake_extensions/branches/main/sql/create_warehouse.sql | 144 | None | 2114cea4c4321590c331e2e7eeb4a29a09b1790c | Thu, 8 May 2025 02:41:11 GMT |
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
リポジトリ ステージ経由でファイルを実行
リポジトリ ステージに変更が反映されたので、ファイルを実行しオブジェクトを作成します。リポジトリ ステージのファイル実行にはsnow git execute
を使用できます。
この際、以下のように最初のファイルは実行できていますが、次のファイル実行時にエラーとなります。
$ snow git execute '@snowflake_extensions/branches/main/' --database governance --schema integrations
SUCCESS - @snowflake_extensions/branches/main/sql/create_database.sql
╭─ Error ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 002003 (02000): 01bc33aa-0002-5f67-0000-000245b21f59: SQL compilation error: │
│ Stage 'GOVERNANCE.INTEGRATIONS.SNOWFLAKE_CLI_TMP_STAGE_1746672595' does not exist or not authorized. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
エラーの内容によると一時ステージに対するアクセス権がないと表示されています。
クエリ履歴を確認
クエリ履歴からどのようにファイルが実行されているか確認します。以下では、関連するクエリのみを抜き出しています。
>select query_text,database_name,schema_name,query_type,user_name,role_name ,warehouse_name from table(snowflake.information_schema.query_history()) order by start_time desc limit 10;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------+--------------+------------+----------------+--------------+----------------+
| QUERY_TEXT | DATABASE_NAME | SCHEMA_NAME | QUERY_TYPE | USER_NAME | ROLE_NAME | WAREHOUSE_NAME |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------+--------------+------------+----------------+--------------+----------------|
| execute immediate from @GOVERNANCE.INTEGRATIONS.snowflake_cli_tmp_stage_☺☺☺☺☺_warehouse.sql | GOVERNANCE | INTEGRATIONS | UNKNOWN | TOMOKIYASUHARA | SYSADMIN | NULL |
| CREATE OR ALTER DATABASE sampledb | GOVERNANCE | INTEGRATIONS | CREATE | TOMOKIYASUHARA | SYSADMIN | NULL |
| USE ROLE SYSADMIN | GOVERNANCE | INTEGRATIONS | USE | TOMOKIYASUHARA | ACCOUNTADMIN | COMPUTE_WH |
| execute immediate from @GOVERNANCE.INTEGRATIONS.snowflake_cli_tmp_stage_1746681826/sql/create_database.sql | GOVERNANCE | INTEGRATIONS | CALL | TOMOKIYASUHARA | ACCOUNTADMIN | COMPUTE_WH |
| ls @GOVERNANCE.INTEGRATIONS.snowflake_cli_tmp_stage_1746681826 | GOVERNANCE | INTEGRATIONS | LIST_FILES | TOMOKIYASUHARA | ACCOUNTADMIN | COMPUTE_WH |
| copy files into @GOVERNANCE.INTEGRATIONS.snowflake_cli_tmp_stage_1746681826/ from @snowflake_extensions/branches/main/ | GOVERNANCE | INTEGRATIONS | COPY_FILES | TOMOKIYASUHARA | ACCOUNTADMIN | COMPUTE_WH |
| create temporary stage if not exists IDENTIFIER('GOVERNANCE.INTEGRATIONS.snowflake_cli_tmp_stage_1746681826') | GOVERNANCE | INTEGRATIONS | CREATE | TOMOKIYASUHARA | ACCOUNTADMIN | COMPUTE_WH |
下から順に実行内容を見ると以下のようにリモートリポジトリと連携した SQL ファイルが実行されているようでした。
- 一時ステージを作成
- 作成した一時ステージにリポジトリステージの実行対象のファイルをコピー
- EXECUTE IMMEDIATE FROMをファイルごとに実行
実行ロールを見ると、Snowflake CLI の接続情報で指定したロールで一時ステージを作成しています。
今回の SQL ファイルでは、以下のように明示的にコンテキストを切り替えておりこのコマンド以降では ROLE_NAME が SYSADMIN となっています。
USE ROLE SYSADMIN;
SYSADMIN は ACCOUNTADMIN の子ロールなので、ACCOUNTADMIN で作成したオブジェクトに対する権限はありません。そのため、Snowflake CLI の接続情報を使用する状態ではじめのファイルは問題なく実行できましたが、コンテキストが切り替わった以降のファイル実行時は、一時ステージを使用することができないことによるエラーが発生していたと考えられます。
コンテキストの設定を無くして再度実行
そこで、以下のようにファイルを変更し、リモートリポジトリに反映します。
--USE ROLE SYSADMIN;
CREATE OR ALTER DATABASE sampledb;
--USE ROLE SYSADMIN;
CREATE OR ALTER WAREHOUSE my_wh
WAREHOUSE_SIZE = XSMALL
AUTO_SUSPEND = 60
INITIALLY_SUSPENDED=TRUE;
この状態であれば、ファイルをまとめて実行することができました。
$ snow git execute '@snowflake_extensions/branches/main/' --database governance --schema integrations
SUCCESS - @snowflake_extensions/branches/main/sql/create_database.sql
SUCCESS - @snowflake_extensions/branches/main/sql/create_warehouse.sql
+--------------------------------------------------------------------------------+
| File | Status | Error |
|--------------------------------------------------------------+---------+-------|
| @snowflake_extensions/branches/main/sql/create_database.sql | SUCCESS | None |
| @snowflake_extensions/branches/main/sql/create_warehouse.sql | SUCCESS | None |
+--------------------------------------------------------------------------------+
クエリ履歴を見るとロール名が Snowflake CLI の接続情報で指定の ACCOUNTADMIN から変更されておらず、これにより問題なく実行できたと考えられます。
)>select query_text,database_name,schema_name,query_type,user_name,role_name ,warehouse_name from table(snowflake.information_schema.query_history()) order by start_time desc limit 10;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------+--------------+------------+----------------+--------------+----------------+
| QUERY_TEXT | DATABASE_NAME | SCHEMA_NAME | QUERY_TYPE | USER_NAME | ROLE_NAME | WAREHOUSE_NAME |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------+--------------+------------+----------------+--------------+----------------|
| CREATE OR ALTER WAREHOUSE my_wh | GOVERNANCE | INTEGRATIONS | CREATE | TOMOKIYASUHARA | ACCOUNTADMIN | COMPUTE_WH |
| WAREHOUSE_SIZE = XSMALL | | | | | | |
| AUTO_SUSPEND = 60 | | | | | | |
| INITIALLY_SUSPENDED=TRUE | | | | | | |
| execute immediate from @GOVERNANCE.INTEGRATIONS.snowflake_cli_tmp_stage_1746686002/sql/create_warehouse.sql | GOVERNANCE | INTEGRATIONS | CALL | TOMOKIYASUHARA | ACCOUNTADMIN | COMPUTE_WH |
| CREATE OR ALTER DATABASE sampledb | GOVERNANCE | INTEGRATIONS | CREATE | TOMOKIYASUHARA | ACCOUNTADMIN | COMPUTE_WH |
| execute immediate from @GOVERNANCE.INTEGRATIONS.snowflake_cli_tmp_stage_1746686002/sql/create_database.sql | GOVERNANCE | INTEGRATIONS | CALL | TOMOKIYASUHARA | ACCOUNTADMIN | COMPUTE_WH |
| ls @GOVERNANCE.INTEGRATIONS.snowflake_cli_tmp_stage_1746686002 | GOVERNANCE | INTEGRATIONS | LIST_FILES | TOMOKIYASUHARA | ACCOUNTADMIN | COMPUTE_WH |
| copy files into @GOVERNANCE.INTEGRATIONS.snowflake_cli_tmp_stage_1746686002/ from @snowflake_extensions/branches/main/ | GOVERNANCE | INTEGRATIONS | COPY_FILES | TOMOKIYASUHARA | ACCOUNTADMIN | COMPUTE_WH |
| create temporary stage if not exists IDENTIFIER('GOVERNANCE.INTEGRATIONS.snowflake_cli_tmp_stage_1746686002') | GOVERNANCE | INTEGRATIONS | CREATE | TOMOKIYASUHARA | ACCOUNTADMIN | COMPUTE_WH |
さいごに
Snowflake CLI でリポジトリステージから複数の SQL ファイルを実行する際に、一部のファイルを実行できなくなる場面があったので、調べた内容をまとめてみました。
オブジェクトデプロイなどで頻繁に権限を変えることはあまりないかもしれませんが、明示的にファイル内でコンテキストを切り替えると、今回のようなエラーが発生し得るため、ご注意ください。
こちらの内容が何かの参考になれば幸いです。