■ はじめに
Snowflake で権限周りのエラーに遭遇したのでメモ。 原因が別の2ケースについて、あげておく。
目次
【1】例1:エラー「Table does not exist or not authorized」時の対応 1)トラブル概要 2)エラー内容 3)原因 4)解決案 【2】例2:エラー「Stage does not exist or not authorized」時の対応 1)トラブル概要 2)エラー内容 3)原因 4)解決案
【1】例1:エラー「Table does not exist or not authorized」時の対応
1)トラブル概要
Python から Snowflake 内のテーブルに対して INSERT文 を実行したら、以下の「【2】エラー内容」が 表示された
2)エラー内容
SQL compilation error: Table 'SAMPLE_TABLE' does not exist or not authorized.
3)原因
SQL compilation error: SQLコンパイルエラー Table 'SAMPLE_TABLE' does not exist or not authorized. テーブル「SAMPLE_TABLE」が存在しない もしくは、権限がない(←今回は、こっち)
4)解決案
* 他にも方法があるだろうが、以下の2点をあげておく => 本来であれば、2)で対応するのだが、 使用ロールの権限がなく、Dev環境だったので 今回は、1)で対応した ~~~~~~~~~ 案1)対象テーブルに対して、権限をはく奪して、テーブル再作成 案2)対象テーブルに対して、使用ロールへの権限を付加 ~~~~~~~~~
案1)対象テーブルに対して、権限をはく奪して、テーブル再作成
* 対応としては、以下の関連記事で行った対応と同じ
https://dk521123.hatenablog.com/entry/2022/08/02/090439
例
-- テーブルのOwnerを変更する GRANT OWNER ON TABLE "SAMPLE_TABLE" TO ROLE admin REVOKE CURRENT GRANTS; -- 一旦、対象テーブルを削除 DROP TABLE "SAMPLE_TABLE"; -- 再作成 CREATE TABLE SAMPLE_TABLE;
案2)対象テーブルに対して、使用ロールへの権限を付加
https://community.snowflake.com/s/article/Error-Procedure-does-not-exist-or-not-authorized-though-the-procedure-exists-in-the-schema
より抜粋。
例
-- [1] ロールを作成 (既存のロールがあればSkip) create or replace role demo_role; -- [2] 対象ユーザ(今回「demo_user」)に対して、 -- 作成したロールの権限を付与 (既にやってあればSkip) grant role demo_role to user demo_user; -- [3] 対象ユーザに対して、対象DB(今回「demo_db」) -- の使用権限を付与 (既にやってあればSkip) grant usage on database demo_db to role demo_user; -- [4] 対象ユーザに対して、対象スキーマ(今回「demo_schema」) -- の使用権限を付与 (既にやってあればSkip) grant usage on schema demo_schema to role demo_user; -- [5] 今回は、全権限、対象ロール「demo_role」に付与 GRANT ALL ON DATABASE demo_db TO ROLE demo_role;
【2】例2:エラー「Stage does not exist or not authorized」時の対応
1)トラブル概要
リファクタリングしている際に発生。 調べた限りだと、権限周りは問題なさそうだった。
SQL例
USE DATABASE sample_db; USE SCHEMA sample_schema; CREATE TABLE sample_db.sample_schema.sample1 IF NOT EXISTS ( id VARCHAR(50) NOT NULL, name VARCHAR(250) ); CREATE OR REPLACE TEMPORARY STAGE sample_db.sample_schema.sample1 URL='s3://your-bucket/xxx/xxxx/' STORAGE_INTEGRATION=sample_storage_integ FILE_FORMAT = (TYPE=PARQUET COMPRESSION=SNAPPY); -- ★ここでエラー COPY INTO sample_db.sample_schema.sample1 FROM ( SELECT $1.id, $1.name FROM @sample_db.sample_schema.sample2 );
2)エラー内容
SQL compilation error: Stage 'SAMPLE_DB.SAMPLE_SCHEMA.SAMPLE2' does not exist or not authorized.
3)原因
* 指定したいStageが誤っており、 結果的に存在していないStageを指定していたため => 「@sample_db.sample_schema.sample1」を指定したかったが 「@sample_db.sample_schema.sample2」を指定していた。
4)解決案
* 正しいStage(@sample_db.sample_schema.sample1)を指定する
修正したSQL文
COPY INTO sample_db.sample_schema.sample1 FROM ( SELECT $1.id, $1.name FROM @sample_db.sample_schema.sample1 );
関連記事
Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
エラー「Insufficient privileges to operate」時の対応
https://dk521123.hatenablog.com/entry/2022/08/02/090439
エラー「Failed to cast variant value "" to XXX」時の対応
https://dk521123.hatenablog.com/entry/2021/12/17/102659
Snowflake ~ 基本編 / アクセス制御 ~
https://dk521123.hatenablog.com/entry/2021/11/16/231010
Snowflake ~ SHOW / DESCRIBE ~
https://dk521123.hatenablog.com/entry/2022/02/24/231532
Snowflake ~ GRANT OWNERSHIP ~
https://dk521123.hatenablog.com/entry/2022/02/25/094250