質問: ### PostgreSQL11で、あるロールからcreat tableの権限をREVOKEしたいです。 下記の2つで、データベース生成禁止、スキーマ生成禁止まではできました。 しかしスキーマ内でテーブルを自由に作成できてしまいます。 テーブル生成を禁止する方法はありますでしょうか? ■これでデーターベース生成の権限を削除 ALTER ROLE ロールの名前 NOCREATEDB; ■データーベース内でスキーマを作らせない REVOKE CREATE ON SCHEMA public FROM ロールの名前; 逆を言えば、指定したDB内の指定したスキーマ内のテーブルをSELECTだけできればよいです。 どうか教えをお聞かせ下さい。
回答: > > テーブル生成を禁止する方法はありますでしょうか? > > > スキーマに対しての権限を与えます。 スキーマの中にテーブルなどのオブジェクトを作成する権限を追加する 追記 設定可能な権限に対して剥奪はできますけど、CREATE対象のオブジェクトとしてテーブルという概念はなさそうなので、剥奪は出来ないのではないかと思います。 GRANT — アクセス権限を定義する > > CREATE > > **対象がデータベース**の場合は、データベース内での新規スキーマの作成を許可します。 > > > **対象がスキーマ**の場合は、スキーマ内での新規オブジェクトの作成を許可します。 既存のオブジェクトの名前を変更するには、オブジェクトを所有し、かつ、そのオブジェクトが入っているスキーマに対してこの権限を保持していなければなりません。 > > > **対象がテーブル空間**の場合は、テーブル空間内でのテーブルとインデックス、一時ファイルの作成と、デフォルトのテーブル空間としてこのテーブル空間を持つデータベースの作成を許可します (この権限の取り消しによって既存のデータベースやスキーマの配置が変わることはないことに注意してください)。 > > > > > > > > > 逆を言えば、指定したDB内の指定したスキーマ内のテーブルをSELECTだけできればよいです。 > > > > > > > > > スキーマーに対してまとめて行うなら ``` GRANT SELECT ON ALL TABLES IN SCHEMA schema_name To role_name; ``` 若しくはREVOKEで指定しているスキーマーが不足しているのではないでしょうか。