Amazon RDS PostgreSQL DB インスタンスのパブリックスキーマでアクセスを取り消そうとするときの「no privileges could be revoked for "public"」という警告メッセージを解決するにはどうすればよいですか?

最終更新日: 2020 年 3 月 5 日

Amazon Relational Database Service (Amazon RDS) PostgreSQL DB インスタンスで REVOKE CREATE ON SCHEMA public FROM PUBLIC を実行しようとしていますが、「no privileges could be revoked for "public"」という警告メッセージを受け取ります。

この警告メッセージの解決方法を教えてください。

簡単な説明

デフォルトで、ユーザーは自分が所有していないスキーマのオブジェクトにアクセスできません。スキーマ内でオブジェクトを使用するには、ユーザーにそのスキーマの USAGE 権限が付与される必要があります。同様に、オブジェクトの作成にも、そのスキーマの CREATE 権限が付与される必要があります。ただし、パブリックスキーマの CREATE 権限と USAGE 権限はすべてのユーザーが持っているため、データベースに接続できるユーザーなら、データベースのパブリックスキーマでオブジェクトを作成する権限を持っています。すべてのユーザーがパブリックスキーマでオブジェクトを作成できないようにするには、その権限を取り消します。

REVOKE CREATE ON SCHEMA public FROM PUBLIC;

注意: このコマンドでは、public がスキーマであり、PUBLIC はすべてのユーザーを意味します。つまり、public は識別子で、PUBLIC はキーワードです。

Amazon RDS PostgreSQL DB インスタンスのパブリックスキーマの CREATE 権限を取り消すと、「no privileges could be revoked for "public"」という警告メッセージを受け取る可能性があります。この警告メッセージが RDS DB インスタンスに表示されるのは、通常、接続しているデータベース内のパブリックスキーマの所有者が rdsadmin であり、データベースの所有者ではない場合です。パブリックスキーマの所有者 rdsadmin は、データベースがデフォルトの template1 ではなく template0 を使用して作成された場合に最もよく発生します。詳細については、テンプレートデータベース に関する PostgreSQL ドキュメントを参照してください。

Amazon RDS PostgreSQL では、データベース template0 の所有者が rdsadmin で、template1 の所有者はマスターユーザーです。template0 を使用してデータベースを作成する場合、パブリックスキーマはマスターユーザーまたはデータベース所有者ではなく rdsadmin によって所有されます。Template0 を使用して作成された以下のデータベース例を参照してください。

testpg=> create database tmp0 template template0;
CREATE DATABASE
tmp0=> SELECT n.nspname AS "Name",
  pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
ORDER BY 1;
List of schemas
Name  |  Owner   
--------+----------
public | rdsadmin
(1 row)

所有者が rdsadmin であるため、REVOKE コマンドが実行されると警告メッセージが返されます。

tmp0=> REVOKE CREATE ON SCHEMA public FROM PUBLIC;
WARNING:  no privileges could be revoked for "public"
REVOKE

解決方法

1.    パブリックスキーマの所有者を変更します。

ALTER SCHEMA public OWNER TO user1;

注意: このコマンド例では、user1 がデータベースの所有者です。

2.    所有権が変更されたことを確認します。

SELECT n.nspname AS "Name",
  pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
ORDER BY 1;
List of schemas
Name  |  Owner   
--------+----------
public | user1
(1 row)

3.    データベースを所有するユーザー名 (user1) を使用して、データベース内から REVOKE コマンドを実行します。

REVOKE CREATE ON SCHEMA public FROM PUBLIC;

パブリックスキーマに関する PostgreSQL ドキュメント

Amazon RDS 上の PostgreSQL

この記事は役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合