目的
Redshiftにおいて、あるユーザーでSELECTを実行したときに以下のように怒られました。
Invaild operation: permission denied for schema
このエラーを解決するしたときのメモとして残しておきます。
概要
上記のエラーは現在使用しているユーザーに権限がなく、クエリが実行できないことを示しています。これを解決するためにはユーザ―に権限を与えます。
解決方法
GRANTを実行して、指定のユーザーに指定の権限を付与します。
以下のクエリを実行します。
GRANT USAGE ON SCHEMA [権限許可をするスキーマ名] TO [権限付与をされるユーザ名];
GRANT SELECT ON ALL TABLES IN SCHEMA [権限許可をするスキーマ名] TO [権限付与されるユーザ名];
説明
USAGE
PostgreSQLドキュメントによると、
スキーマにおいて、指定したスキーマに含まれるオブジェクトへのアクセスを許可します(オブジェクト自体の権限要件が満たされている場合)。基本的には、この権限によってスキーマ内のオブジェクトを"検索"する権限も認められます。
Redshiftドキュメントによると、
特定のスキーマに対して USAGE 権限を付与します。これによって、そのスキーマ内のオブジェクトにユーザーがアクセスできるようになります。ローカルの Amazon Redshift スキーマでは、これらのオブジェクトに対する特定のアクションを個別に許可する必要があります (例: テーブルに対する SELECT または UPDATE 権限)。
USAGE権限を付与しますって何でしょうかという感じですが、Usageは「使用法」「用法」「利用」という意味なので、利用を許可するという解釈にしておきます。私はこのUSAGEを実行せずにSELECT ONのみを実行していたため、スムーズに権限を与えられていませんでした。
SELECT ON ALL TABLES
TO以下のユーザーに全てのテーブルに対してSELECT権限を与えています。このALL TABLESという文言でVIEWを含んだ全てのテーブルへのSELECTが許可されます。VIEWを許可する場合、それらに関するテーブルの権限も与えることも忘れないようにしましょう。
まとめ
GRANTを使用して特定のユーザーに権限を与えようとしたとき、USAGEも忘れずに実行しましょう。