【Snowflake】【トラブル】エラー「<Object> does not exist or not authorized」時の対応

■ はじめに

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