公式ドキュメントにわかりやすい説明が見つからなかったので、実際にRedshiftを動かして試した結果をまとめました。試した結果なので、違ってたらごめんなさい。
図の中の3つのライン
- 通常のRedshift内のtableにviewを通してアクセス(PostgreSQLでも同様)
- Redshift Spectrumの外部スキーマのtableに直接アクセス
- Redshift Spectrumの外部スキーマのtableにviewを通してアクセス
1. 通常のRedshift内のtableにviewを通してアクセス(PostgreSQLでも同様)
まず、DB userはviewへのSELECT権限が必要です。viewを作成したオーナーであればSELECT権限があります。viewを作成したのが別のDB userの場合は、オーナーを変更するかGRANTする必要があります。
次に、viewのオーナーはtableへのSELECT権限が必要です。tableを作成したオーナーであればSELECT権限があります。tableを作成したのが別のDB userの場合は、オーナーを変更するかGRANTする必要があります。
これらの条件を満たせば、DB userはtableへのSELECT権限を持っていなくても、viewを通すことでtableにあるデータにアクセスできます。
これはPostgreSQLでも同じです。
2. Redshift Spectrumの外部スキーマのtableに直接アクセス
DB userはSpectrumの外部スキーマのUSAGE権限が必要です。外部スキーマを作成したオーナーであればUSAGE権限があります。外部スキーマを作成したのが別のDB userの場合は、オーナーを変更するかGRANTする必要があります。
3. Redshift Spectrumの外部スキーマのtableにviewを通してアクセス
まず、DB userはviewへのSELECT権限が必要です。viewを作成したオーナーであればSELECT権限があります。viewを作成したのが別のDB userの場合は、オーナーを変更するかGRANTする必要があります。
次に、viewを参照するDB userは外部スキーマのUSAGE権限が必要です。外部スキーマを作成したオーナーであればUSAGE権限があります。外部スキーマを作成したのが別のDB userの場合は、オーナーを変更するかGRANTする必要があります。
1と2の事実からすると、3のケースでは、外部スキーマのUSAGE権限が必要なのはviewのオーナーだと思ったのですが、viewのオーナーは関係なくて、viewを参照するDB userが直接外部スキーマへの権限を必要とするようなんです。
そうなのか。。。