-
2025-05-10 PostgreSQLPostgreSQL ナレッジPostgreSQL バージョンアップ
バージョンによる GRANT 文の挙動の違い
バージョンによる GRANT 文(ロールを付与する GRANT 文)の違い
前回の記事( https://www.insight-ltd.co.jp/tech_blog/postgresql/pg-knowledge/910/ )で、ロールを付与する GRANT 文を実行した際に発生する "ERROR: permission denied to grant privileges as role <ロール名>" について記載しました。
その際に、バージョンによって GRANT 文の挙動や仕様について違いがあることを確認しましたが、ややこしい説明になっていましたので、今回の記事でまとめていこうと思います。
GRANTED BY を省略した場合の動作
まず GRANTED BY を省略した場合に、どのような挙動となるかを確認しました。
バージョンによって挙動が変わることを確認できましたので、下記に記載します。
バージョン | 挙動 |
---|---|
v15 以前 | GRANT 文を実行したロールが指定される |
v16 以降 | postgres ロールが指定される |
つまり、
のような GRANT 文を super_user という名前のロール(SUPERUSER 属性を持つロール)が実行した場合、GRANT role_a TO role_b;
- v15 以前
- GRANT 文を実行した super_user ロールが、GRANTED BY に指定された状態
- v16 以降
- postgres ロールが、GRANTED BY に指定された状態
となります。
ADMIN OPTION がなくても GRANT 文を実行できるか
次に、ロールの付与者が ADMIN OPTION を持っていない場合の挙動を確認しました。
ロールを付与する GRANT 文を実行する際、ロールの付与者は、付与するロールに対して ADMIN OPTION を持っている必要があります。
分かりにくいので SQL 例を下記に記載します。
GRANT role_a TO role_b GRANTED BY role_c;
とした場合
- 付与されるロール(granted role) = role_a
- 受け取るロール(grantee) = role_b
- ロールの付与者(grantor) = role_c
となります。
この GRANT 文がエラーなく実行されるには、role_c が role_a に対して ADMIN OPTION を持っている必要があります。
バージョンごとの例外(ADMIN OPTION が必要かどうか)
ただし、必ずロールの付与者が付与するロールに対して ADMIN OPTION を持っていなければならないかというと、バージョンによっていくつかの例外があります。
バージョンごとの例外条件を下記に記載します。
v14 以前
- GRANT 文の実行者が postgres ロール
- GRANTED BY に ADMIN OPTION を持たないロールを指定してもエラーとならない
- GRANT 文の実行者が SUPERUSER 属性を持つロール
- GRANTED BY に ADMIN OPTION を持たないロールを指定してもエラーとならない
- ロールの付与者と付与するロールが同一
- GRANTED BY が省略された場合には、GRANT 文を実行したロールがロールの付与者となる
v15
- GRANT 文の実行者が postgres ロール
- GRANTED BY に ADMIN OPTION を持たないロールを指定してもエラーとならない
- GRANT 文の実行者が SUPERUSER 属性を持つロール
- GRANTED BY に ADMIN OPTION を持たないロールを指定してもエラーとならない
v16 以降
- GRANT 文の実行者およびロールの付与者が postgres ロール
- GRANTED BY が省略された場合には、postgres ロールがロールの付与者となる
- GRANT 文の実行者が SUPERUSER 属性を持つロールで、ロールの付与者が postgres ロール
- GRANTED BY が省略された場合には、postgres ロールがロールの付与者となる
上記の条件を満たす場合、ADMIN OPTION がなくてもロールを付与する GRANT 文がエラーなく実行されます。
まとめ
GRANT 文のバージョンによる挙動の相違について、まとめてみましたが結局のところ分かりにくい説明となってしまいました。
GRANTED BY を指定した/省略した場合の挙動がバージョンによって違うことが、分かりにくさに拍車をかけているように思えました。
例えば、v14 以前では GRANTED BY に ADMIN OPTION を持たないロールを指定しても、postgres ロールで GRANT 文を実行する場合にはエラーが発生しませんが、v16 以降ではエラーとなります。
こういったバージョンよって同じ GRANT 文でもエラーが発生する/しないとなりますので、メジャーバージョンアップの際には特に注意するべき部分となります。